我在关系数据库中有一个包含大量日期的表格。 我的应用程序逻辑我将一天分为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
答案 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