从DateTime中提取和聚合小时,并使用AM / PM格式化小时

时间:2014-10-03 19:20:46

标签: sql-server tsql

我有一个包含Datetime2的列,需要提取,聚合和格式化小时,以便它具有AM / PM。

下表显示了客户每天的访问时间: 我需要对小时进行分组,以便汇总1 pm范围内的所有时间。

处理前:

CustomerID  Arrival
1           1:15 PM
2           1:20 PM
3           1:30 PM
4           2:00 PM
5           2:05 PM
6           2:13 PM

我需要输出看起来像下面的格式: 注意:每小时访问是一小时范围内访问的客户总数。所以3个客户 下午1点参观访问,下午2点访问3个。

HourlyVisit Arrival
3           1:00 PM
3           2:00 PM

我尝试了这段代码,我得到了时间并将其汇总,但我需要将时间设置为更易读的格式。

WITH CTE AS
(
  SELECT CustomerID = COUNT(CustomerID), 
  HourlyFrequency = DATENAME(HOUR, Arrival)
  FROM MySchema.MyTable
  GROUP BY Arrival
  )

  SELECT HourlyVisit = SUM(CustomerID), HourlyFrequency
  FROM CTE

  GROUP BY HourlyFrequency

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT  CustomerCount = COUNT(*)
        , ArrivalHour = STUFF(RIGHT(CONVERT(VARCHAR(20), Arrival, 100), 7), 4, 2, '00 ')
FROM    MySchema.MyTable
GROUP BY STUFF(RIGHT(CONVERT(VARCHAR(20), Arrival, 100), 7), 4, 2, '00 ');

答案 1 :(得分:0)

假设它们是日期时间,您应该能够抓住小时,并使用datepart进行分组。

GROUP BY DATEPART(hh, Arrival)

答案 2 :(得分:0)

WITH CTE AS
(
  SELECT CustomerID = COUNT(CustomerID), 
  HourlyFrequency = DATENAME(HOUR, Arrival)
  FROM MySchema.MyTable
  GROUP BY Arrival
  )

  SELECT CustomerID = SUM(CustomerID), RIGHT(CONVERT(CHAR(20), DATEADD(hour,CAST(HourlyFrequency AS INT),0), 22), 11)
  FROM CTE

  GROUP BY HourlyFrequency

我认为这对您有用,但您应该尝试在客户端进行此类操作。