2016-12-05 1 views
0

Следующий запрос разбивает временную метку на дату, forecast_day и час, forecast_hour.Переименовать полуночную метку в качестве Часа 24 предыдущего дня

Моя проблема перекачивает метку 2016-02-01 00:00:00 вернуть forecast_day в предыдущий день 2016-01-31 и forecast_hour из 24. Код ниже просто возвращает forecast_day из 2016-02-01 и forecast_hour 0 для такой метки времени.

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,