SQL查询错误:我放置了一个CASE表达式来选择日期,以获得早班、晚班和夜班的结果(计数)

SQL查询错误:我放置了一个CASE表达式来选择日期,以获得早班、晚班和夜班的结果(计数),sql,datetime,time,case,Sql,Datetime,Time,Case,我想从前15天中选择datetime,然后为我想要的每一天选择datetime 将计数设置为“晚上、早上、晚上” 下面是我试图运行的代码,用于从smsOutboxHistory表中选择前15天的datetime,然后通过将datetime分隔为小时,在datetime上应用CASE语句,最后应用count以获得所需的结果。 但这不起作用,并且在案例陈述附近给我错误信息 选择不同的顶部(100%)转换(varchar(20),OH_Datetime,101)作为日期 案例 当CAST(DATEPA

我想从前15天中选择datetime,然后为我想要的每一天选择datetime 将计数设置为“晚上、早上、晚上”

下面是我试图运行的代码,用于从smsOutboxHistory表中选择前15天的datetime,然后通过将datetime分隔为小时,在datetime上应用CASE语句,最后应用count以获得所需的结果。
但这不起作用,并且在案例陈述附近给我错误信息

选择不同的顶部(100%)转换(varchar(20),OH_Datetime,101)作为日期
案例

当CAST(DATEPART(hh,OH_Datetime)作为varchar)>=00,CAST(DATEPART(hh,OH_Datetime)作为varchar)=8,CAST(DATEPART(hh,OH_Datetime)作为varchar)=18,并将DATEPART(hh,OH_Datetime)作为varchar进行CAST时,您需要
分组依据
,而不是
选择distinct
。还有一个伯爵。不要将小时数转换为字符串进行比较。因此:

SELECT CAST(OH_DateTime as DATE) AS Date,
       SUM(CASE WHEN DATEPART(hour, OH_Datetime) >= 00 AND DATEPART(hour, OH_Datetime <= 7
               THEN 1 ELSE 0
           END) AS Morning,
       SUM(CASE WHEN DATEPART(hour, OH_Datetime) >= 8 AND DATEPART(hour, OH_Datetime <= 17
               THEN 1 ELSE 0
           END) AS NIGHT,
       SUM(CASE WHEN DATEPART(hour, OH_Datetime) >= 18 AND DATEPART(hour, OH_Datetime <= 24
               THEN 1 ELSE 0
           END) AS Evening
FROM  dbo.smsOutboxHistory OH_Datetime
WHERE OH_Datetime >= DATEADD(day, -15, GETDATE()) 
GROUP BY CAST(OH_DateTime as DATE)
ORDER BY CAST(OH_DateTime as DATE);
选择CAST(OH_DateTime作为日期)作为日期,
求和(DATEPART(hour,OH_Datetime)>=00和DATEPART(hour,OH_Datetime=8和DATEPART(hour,OH_Datetime=18和DATEPART(hour,OH_Datetime=DATEADD(day,-15,GETDATE())时的情况)
按演员分组(OH_日期时间为日期)
按演员顺序(OH_日期时间为日期);

您使用的是哪种DBMS?为什么强制转换为varchar?这无法与数字相比。“这给了我一个错误”-您可能需要更具体一些。您的问题和实际错误消息中的副本是什么?您用
dbo.smsOutboxHistory将表别名为OH_Datetime
for?这很容易混淆,因为您有一个同名列。Case表达式,而不是Case语句…
IIF
可能比t
Case-WHEN更好
here?删除其中的逗号OH_Datetime,>=..,并且
DATEPART
函数缺少右括号。(在已经编辑时,您还可以删除不必要的表别名。:-@MincongHuang…我看不出像
IIF()这样的定制函数是如何实现的。)
(仅在SQL Server和MS Access中可用)可能比ANSI标准方法做同样的事情要好。它的可读性可能更好,因为它更短:这里是一个
案例,当…
需要3行和
IIF()
取1。然后,它表明这是一个布尔选择。最后一件事,我同意使用ANSI标准更好,但语句的简单性应该更优先,因为人们处理的是特定的数据库,而不是到处应用SQL。你同意我的观点吗?
SELECT DISTINCT TOP (100) PERCENT CONVERT(varchar(20), OH_Datetime, 101) AS DT, COUNT(*) AS SMScnts
FROM         dbo.smsOutboxHistory AS OH_Datetime
WHERE     (DATEDIFF(day, OH_Datetime, GETDATE()) <= 15)
GROUP BY CONVERT(varchar(20), OH_Datetime, 101), CASE WHEN CAST(DATEPART(hh, OH_Datetime) AS varchar) >= 0 AND CAST(DATEPART(hh, OH_Datetime) AS varchar) 
                      <= 8 THEN 'Night' WHEN CAST(DATEPART(hh, OH_Datetime) AS varchar) >= 8 AND CAST(DATEPART(hh, OH_Datetime) AS varchar) 
                      <= 16 THEN 'Morning' WHEN CAST(DATEPART(hh, OH_Datetime) AS varchar) >= 16 AND CAST(DATEPART(hh, OH_Datetime) AS varchar) 
                      <= 24 THEN 'Evening' END
ORDER BY DT
SELECT CAST(OH_DateTime as DATE) AS Date,
       SUM(CASE WHEN DATEPART(hour, OH_Datetime) >= 00 AND DATEPART(hour, OH_Datetime <= 7
               THEN 1 ELSE 0
           END) AS Morning,
       SUM(CASE WHEN DATEPART(hour, OH_Datetime) >= 8 AND DATEPART(hour, OH_Datetime <= 17
               THEN 1 ELSE 0
           END) AS NIGHT,
       SUM(CASE WHEN DATEPART(hour, OH_Datetime) >= 18 AND DATEPART(hour, OH_Datetime <= 24
               THEN 1 ELSE 0
           END) AS Evening
FROM  dbo.smsOutboxHistory OH_Datetime
WHERE OH_Datetime >= DATEADD(day, -15, GETDATE()) 
GROUP BY CAST(OH_DateTime as DATE)
ORDER BY CAST(OH_DateTime as DATE);