SQL组按不同时间段与日期

时间:2010-07-16 14:41:01

标签: sql

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

例如,该表包含以下字段:

Id (int), EntryDate (datetime), SaleReference (varchar) 

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

Date        Sales 9am-12pm   Sales 12pm-3pm   Sales 6pm-9pm
----------  --------------   --------------   -------------
01-01-2010        10               20               6  
02-01-2010        12               16               3  
03-01-2010        43               11               2  

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

2 个答案:

答案 0 :(得分:5)

假设下面是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 :(得分:1)

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

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

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