2016-12-05 10 views
0

以下のクエリは、タイムスタンプを日付、forecast_day、および時刻forecast_hourに分解します。真夜中のタイムスタンプの名前を前日の24時間と変更します。

私の問題は、2016年1月31日、前日のforecast_dayと以下のコードは、ちょうど2016年2月1日のforecast_dayと、このようなタイムスタンプのための0のforecast_hour返す24のforecast_hourを返すために2016-02-01 00:00:00のタイムスタンプを処理しています。

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は1日の最後の秒です。 24:00:00は存在しません。 0:00:00は翌日です。それは時間が普遍的に知られている方法です。 0:00:00に前日の最後の秒を表す場合は、/ case文を使用して0:00:00の時刻をday-1として管理する必要があります。しかし、なぜ?!? 0:00:00は毎日0-1秒です!あなたがしたいように思えるものは0:00:01に始まりますが、それまでに1秒が過ぎました! – 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, 
関連する問題