【问题标题】:SQL Group by different time periods with daySQL Group 按不同时间段与一天
【发布时间】:2010-07-16 14:41:00
【问题描述】:

我需要查询一个销售表,并让结果表显示给定日期内不同时间段的细分。

例如,表格有以下字段:

Id (int)、EntryDate (日期时间)、SaleReference (varchar)

我想制作一个如下所示的表格:

日期 销售 9am-12pm 销售 12pm-3pm 销售 6pm-9pm ---------- -------------- -------------- ------------ - 01-01-2010 10 20 6 02-01-2010 12 16 3 03-01-2010 43 11 2

对此的任何帮助将不胜感激。 谢谢

【问题讨论】:

  • Stephen - 您使用的是什么 RDBMS 和版本?

标签: sql


【解决方案1】:

假设 SQL Server 下面。如果不是类似的逻辑可能适用于您的 RDBMS,但可能会使用不同的函数从日期时间获取小时部分,并且 BETWEEN 的行为也可能不同(在 SQL Server 中,它是一个包含范围)。

SELECT CAST([Date] AS Date) AS [Date],
COUNT(CASE WHEN DATEPART(hour, [Date]) BETWEEN 9 AND 11 THEN 1 ELSE NULL END)
    AS [Sales 9am-12pm],
COUNT(CASE WHEN DATEPART(hour, [Date]) BETWEEN 12 AND 14 THEN 1 ELSE NULL END) 
    AS [Sales 12pm-3pm],
COUNT(CASE WHEN DATEPART(hour, [Date]) BETWEEN 18 AND 20 THEN 1 ELSE NULL END) 
    AS [Sales 6pm-9pm]
FROM Table
GROUP BY CAST([Date] AS Date) /*For SQL2008*/

注意:以前版本的 SQL Server 需要更多的循环才能从日期时间中获取日期部分。例如CAST(FLOOR( CAST( GETDATE() AS FLOAT ) ) AS DATETIME(来自here

【讨论】:

  • 您按日期分组,这将是一个日期时间。不幸的是,它不会正确分组。将日期投射为日期,并在选择中放置相同的演员,它将被修复。现在 +1 :)
  • @Mike - 好地方。现已修复。
  • 这简直太完美了。感谢马丁和迈克。 :-)
  • 抱歉...再次回到这个问题 ;-) 如果表格包含包含销售价值的列,我将如何获得每个时间段的总销售价值?
  • 添加SUM(CASE WHEN DATEPART(hour, [Date]) BETWEEN 9 AND 11 THEN salesVal ELSE 0 END) AS [Sales Value 9am-12pm]
【解决方案2】:

假设您的数据库支持这种日期数学,您可以说:

CASE WHEN EntryDate - date(EntryDate) >= INTERVAL '9 hours'
      AND EntryDate - date(EntryDate) < INTERVAL '12 hours'
     THEN ...

(这是 PostgreSQL 区间语法,顺便说一句...可能是非标准的。)但可能有更优雅的方法。

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2020-10-09
    • 2023-03-25
    相关资源
    最近更新 更多