记录与“当天特定时间”之间的SQL时差

时间:2011-03-02 13:36:26

标签: sql postgresql time

我在关系数据库中有一个包含大量日期的表格。 我的应用程序逻辑我将一天分为4个部分,每个部分为6小时,从00:00,6:00,0:00和18:00开始。 现在我想找到一天中每个季度数据库中最早记录的时差,以及开始时间的差异。我怎么能这样做?

在psuedo-sql中,我猜它看起来像

select min(created_at - ROUND_DOWN_TO_6_HOURS(created_at)) from mytabel group by day_quater;

问题是如何计算“ROUND_DOWN_TO_6_HOURS”。因此,如果“created_at”是19:15,它将向下舍入到18:00,“created_at - ROUND_DOWN_TO_6_HOURS(created_at)”将返回1:15小时

我正在使用psql

4 个答案:

答案 0 :(得分:1)

如果您只是想找到与这些范围匹配的记录,您可以在WHERE子句中使用它,如

select * from myTable 
where datepart(hh, created_at) between 0 and 6

如果您尝试创建一个具有00或06的计算字段...那么您可以使用sql中的“DatePart()”函数来拉动小时... DATEPART(hh,date)...这将返回0,1,2,3,... 23的数值,您可以根据列出的小时数之间的值计算一个字段......

这是一个样本......

select 
case  
   when datepart(hh, add_dt) between 0 and 6 then 1 
   when datepart(hh, add_dt) between 7 and 12 then 2 
   when datepart(hh, add_dt) between 13 and 18 then 3 
   when datepart(hh, add_dt) between 19 and 24 then 4 
end  
from myTable 
where add_dt is not null

答案 1 :(得分:0)

您可以将CASE与日期列和日期时间函数结合使用来建立季度(1,2,3,4),并从日期时间值中提取日期部分,按日,季度和然后使用MIN(你的日期栏)抓住每个季度分组中的最早时间。

不确定“期初”是什么意思。但你可以衡量任何任意日期时间与你每天每季度最早时间的一组之间的差异,并以上述方式实例化。

http://www.postgresql.org/docs/8.2/static/functions-datetime.html

答案 2 :(得分:0)

我的PostgreSQL有点生疏,但是这样的话:

select
    date_trunc('day',CreatedOn) [Day],
    min(case when date_part('hour',TIMESTAMP CreatedOn) < 6 then '00:00'
          when date_part('hour',TIMESTAMP CreatedOn) < 12 then '06:00'
          when date_part('hour',TIMESTAMP CreatedOn) < 18 then '12:00'
          else '18:00'
         end) [Quarter]
from MyTable
group by date_trunc('day',CreatedOn)
order by date_trunc('day',CreatedOn)

答案 3 :(得分:0)

select 
  record::time - (case
     when record::time >= '18:00' then '18:00'
     when record::time >= '12:00' then '12:00'
     when record::time >= '6:00' then '6:00'
     else '0:00' end
     )::time as difference
from my_table