Sql server 使用case语句和datetime格式求和

Sql server 使用case语句和datetime格式求和,sql-server,datetime,select,sum,case,Sql Server,Datetime,Select,Sum,Case,我有一个简单的查询,我注意到当我写sum语句时,得到的和数与我期望的不匹配。我认为这是在使用“datetime”格式评估列时发生的。不知道如何避开它。在寻找正确的短语以找到解决方案时遇到困难,但我希望这是一个常见的短语。可能是演员阵容或转换为日期格式,但这些确实产生了有意义的答案 SELECT X.X_ITEMID, SUM(CASE WHEN X.ActivityDate < '11/29/2016' THEN X.Qty ELSE 0 END) AS SUM_X

我有一个简单的查询,我注意到当我写sum语句时,得到的和数与我期望的不匹配。我认为这是在使用“datetime”格式评估列时发生的。不知道如何避开它。在寻找正确的短语以找到解决方案时遇到困难,但我希望这是一个常见的短语。可能是演员阵容或转换为日期格式,但这些确实产生了有意义的答案

SELECT   X.X_ITEMID,
         SUM(CASE WHEN X.ActivityDate < '11/29/2016' THEN X.Qty ELSE 0 END) AS SUM_X

FROM     ERP_X X

WHERE    X_ITEMID = 'abcdef'
GROUP BY X.X_ITEMID
选择X.X\u ITEMID,
总和(如果X.ActivityDate<'11/29/2016',则X.Qty ELSE 0结束)作为总和
来自ERP_X
其中X_ITEMID='abcdef'
按X.X_项目ID分组

当您将日期[时间]与字符文字进行比较时,日期将转换为字符(使用默认的日期格式),然后按字典进行比较,这几乎总是一个坏主意。相反,您应该显式地将字符串文字转换为日期时间,并允许数据库正确地比较它们:

SELECT   X.X_ITEMID,
         SUM(CASE WHEN X.ActivityDate < CONVERT(datetime, '11/29/2016', 101) 
                  THEN X.Qty 
                  ELSE 0 
             END) AS SUM_X
FROM     ERP_X X
WHERE    X_ITEMID = 'abcdef'
GROUP BY X.X_ITEMID
选择X.X\u ITEMID,
总和(X.ActivityDate<转换时的情况(日期时间,'11/29/2016',101)
然后是X数量
其他0
结束)作为SUM_X
来自ERP_X
其中X_ITEMID='abcdef'
按X.X_项目ID分组

试试下面的代码,我希望它能为您提供所需的正确结果

SELECT   X.X_ITEMID,
         SUM(CASE WHEN convert(char(8),X.ActivityDate,112) < '20161129'
                  THEN X.Qty 
                  ELSE 0 
         END) AS SUM_X FROM     ERP_X X
WHERE    X_ITEMID = 'abcdef'
GROUP BY X.X_ITEMID
选择X.X\u ITEMID,
总和(转换时的大小写)(字符(8),X.ActivityDate,112)<'20161129'
然后是X数量
其他0
结束)作为来自ERP的总和
其中X_ITEMID='abcdef'
按X.X_项目ID分组

活动日期列的数据类型是什么?活动日期是日期时间数据类型。