按星期几和每小时对SQL进行排序/分组

时间:2011-08-21 14:52:51

标签: sql sql-server group-by sql-order-by utc

我有一个SQL Server 2005表,其中包含带有UTC / GMT日期字段的记录。 我需要记录GROUPed BY和ORDERed的“星期几”和“一天中的小时”。给7 * 24 = 168组。输出看起来像:

Sun 12am
Sun  1am
Sun  2am
.... etc
Mon 12am
Mon  1am
.... etc
.... etc
Sat 10pm
Sat 11pm

一切正常,直到我尝试将东西转换为我当地的时区。 在SQL中进行转换:

SELECT MIN(Key),MIN(SavedOn), 
FROM MyTable 
GROUP BY (DatePart(WEEKDAY, SavedOn)*24.0) + DatePart(HOUR, SavedOn) - (5.0/24.0)
ORDER BY (DatePart(WEEKDAY, SavedOn)*24.0) + DatePart(HOUR, SavedOn) - (5.0/24.0)

或者在以UTC格式排序/获取记录后,在我自己的代码中进行转换:

SELECT MIN(Key),MIN(SavedOn), 
FROM MyTable 
GROUP BY (DatePart(WEEKDAY, SavedOn)*24.0) + DatePart(HOUR, SavedOn)  
ORDER BY (DatePart(WEEKDAY, SavedOn)*24.0) + DatePart(HOUR, SavedOn) 

(my own math here)

无论哪种方式...... 5条记录将出现“乱序”。本周结束记录(周六下午) 出现在本周开始......不是结束......他们属于哪里。

对我做错了什么的想法?

2 个答案:

答案 0 :(得分:4)

浮点数学是不精确的。乘以24.0会产生边框错误。

而不是添加数字

GROUP BY (DatePart(WEEKDAY, SavedOn)*24.0) + DatePart(HOUR, SavedOn)  

在两个字段上排序:

GROUP BY DatePart(WEEKDAY, SavedOn), DatePart(HOUR, SavedOn) 

答案 1 :(得分:1)

这是我要做的。我不确定我完全明白你在尝试什么:

SELECT DatePart(WEEKDAY, SavedOn), DatePart(HOUR, SavedOn) , min(key)
FROM MyTable 
GROUP BY DatePart(WEEKDAY, SavedOn), DatePart(HOUR, SavedOn)
ORDER BY 1, 2

如果您的转换方法只是增加5小时,那么每次看到SavedOn时都会这样做,如下所示:

SELECT DatePart(WEEKDAY, SavedOn+5.0/24.0), DatePart(HOUR, SavedOn+5.0/24.0) , min(key)
FROM MyTable 
GROUP BY DatePart(WEEKDAY, SavedOn+5.0/24.0, DatePart(HOUR, SavedOn+5.0/24.0)
ORDER BY 1, 2