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

Sql server 从DateTime提取和聚合小时,并使用AM/PM格式化小时,sql-server,tsql,Sql Server,Tsql,我有一个包含Datetime2的列,需要提取、聚合和格式化小时,使其具有AM/PM 下表显示了每天工作时间内的客户访问: 我需要对小时进行分组,以便聚合下午1点范围内的所有时间 处理前: 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 我需要输出如下格式: 注:每小

我有一个包含Datetime2的列,需要提取、聚合和格式化小时,使其具有AM/PM

下表显示了每天工作时间内的客户访问: 我需要对小时进行分组,以便聚合下午1点范围内的所有时间

处理前:

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
我需要输出如下格式: 注:每小时访问量是一小时范围内的总客户访问量。So 3客户 下午1点参观,下午2点参观3次

我尝试了这段代码,我得到了小时数,它是聚合的,但我需要把小时数转换成更可读的格式

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
试试这个:

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 ');

假设它们是日期时间,您应该能够抓取时间,并使用分组


我认为这应该对你有用,但你可能应该尝试在客户端进行这种操作。

你想要的输出是什么?@AdamWenger:我已经在问题中添加了这一点,它被标记为;之后。凯文:我将在下午12点到下午0点。@unserage\u Guy你说得对。。。编辑我的答案,让我知道它是否更好。凯文:我这样修改它:CTE为SELECT CustomerCount=COUNT*,ArrivalHour=STUFFRIGHTCONVERTVARCHAR20,Arrival,100,7,4,2,'00'来自MySchema。MyTable GROUP BY Arrival选择NumberOfVisite=SUMCustomerCount,ArrivalHour来自CTE GROUP BY ArrivalHour
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 ');
GROUP BY DATEPART(hh, Arrival)
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