我有一个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条记录将出现“乱序”。本周结束记录(周六下午) 出现在本周开始......不是结束......他们属于哪里。
对我做错了什么的想法?
答案 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