2016-12-05 126 views
0

以下查询将时间戳分解为日期forecast_day和小时forecast_hour将午夜时间戳重命名为前一天的第24小时

我的问题是处理的2016-02-01 00:00:00时间戳返回先前的2016年1月31日一天的forecast_day和24.下面的代码只是返回的2016年2月1日forecast_day和这样一个时间戳0 forecast_hourforecast_hour

select 
    a.lat, a.lon, 
    date_trunc('day', a.foretime - interval '5 hours')::date as forecast_day, 
    extract(hour from a.foretime - interval '5 hours') as forecast_hour, 
    f.windspeed as forecast, 
    a.as_of - interval '5 hours' as latest_as_of 
from weather.forecast f 
    join (select 
      foretime, 
      max(as_of) as as_of, 
      lat, lon 
     from weather.forecast 
     where date_trunc('day', foretime - interval '5 hours')::date - as_of >= interval '9 hours' 
     group by foretime, lat, lon) a using (foretime, as_of, lat, lon) 
+0

23:59:59是一天的最后一秒。 24:00:00不存在。第二天0:00:00。这就是时间是如何被普遍认识的。如果您希望0:00:00表示前一天的最后一秒,那么您需要使用if/case语句将0:00:00时间管理为第1天。但为什么?!? 0:00:00是每天0-1秒!看起来你想要做的是在0:00:01开始新的一天,但到那时已经过去了整整一秒! – xQbert

+0

@xQbert好东西。谢谢(你的)信息。 – otterdog2000

回答

2

您会使用case。 。 。或技巧:

select . . . 
     (case when extract(hour from a.foretime - interval '5 hours') = 0 
      then date_trunc('day', a.foretime - interval '5 hours')::date - interval '1' day 
      else date_trunc('day', a.foretime - interval '5 hours')::date 
     end) as forecast_day, 
     (case when extract(hour from a.foretime - interval '5 hours') = 0 
      then 24 
      else extract(hour from a.foretime - interval '5 hours') 
     end) as forecast_hour, 
相关问题