【问题标题】:Sorting/Grouping SQL by day-of-week and hour-of-day按星期几和星期几对 SQL 进行排序/分组
【发布时间】:2011-10-31 15:01:17
【问题描述】:

我有一个 SQL Server 2005 表,其中包含带有 UTC/GMT 日期字段的记录。 我需要按“星期几”和“一天中的小时”对记录进行分组和排序。给出 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 条记录都会出现“乱序”。周末记录(周六下午) 出现在一周的开始......而不是结束......他们所属的地方。

知道我做错了什么吗?

【问题讨论】:

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


    【解决方案1】:

    浮点数学不精确。乘以 24.0 会导致边界错误。

    而不是添加数字

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

    改为对两个字段进行排序:

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

    【讨论】:

    • 但是乘法现在是导致错误的原因,是吗?我认为这是转换到东部时间,或者任何 TZ,OP 正在做的事情。没有?
    • 在这种情况下,我的“ORDER BY”行会是什么?
    【解决方案2】:

    这就是我要做的。我不确定我是否完全理解您的尝试:

    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
    

    【讨论】:

    • 我很乐意修复我的原始帖子。哪一部分不清楚?
    • 我尝试了您的解决方案...它仍然返回一些“Sat PM”组...然后...返回“Sun AM”。我需要按照我的列表中所示对它们进行排序...周日...周一...周二...等。不是周六..周日...周一...等
    • @Carol - 即使到处都添加了 5/24?我想我以前做过这个并且它有效。您能确认以上是您尝试过的吗?
    猜你喜欢
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2014-06-26
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多