2016-12-05 2 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는 하루의 마지막 순간입니다. 24:00:00은 존재하지 않습니다. 0:00:00은 다음날입니다. 그것은 시간이 보편적으로 알려지는 방법입니다. 0:00:00에 이전 요일의 마지막 초를 나타내려면/case 문을 사용하여 0:00:00 시간을 day-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,