SQL错误中按月分组

SQL错误中按月分组,sql,group-by,Sql,Group By,我使用以下代码 SELECT SUM(PlanTotal) as PlanTotal, PlanStartDate FROM TEST.dbo.Plans WHERE DATEDIFF(MONTH, cast(cast(PlanStartDate AS varchar(8)) AS datetime), GETDATE()) <= 6 GROUP BY PlanStartDate ORDER BY PlanStartDate 但是,我只

我使用以下代码

SELECT 
    SUM(PlanTotal) as PlanTotal, PlanStartDate
FROM 
    TEST.dbo.Plans
WHERE  
    DATEDIFF(MONTH, cast(cast(PlanStartDate AS varchar(8)) AS datetime), GETDATE()) <= 6
GROUP BY 
    PlanStartDate
ORDER BY 
    PlanStartDate
但是,我只得到一个错误:

将表达式转换为数据类型datetime时出现算术溢出错误

我不明白我做错了什么。我需要包括cast函数,因为
PlanStartDate
是数值函数,而不是
datetime


谢谢

您遇到的问题是由于从字符串转换为日期。只有当
PlanStartDate
是字符串时,才会在查询中出现这种情况

因为您最初的查询是有效的,我怀疑这也会有效:

SELECT SUM(PlanTotal) as PlanTotal, MONTH(cast(cast(PlanStartDate as varchar(8)) as datetime))
FROM TEST.dbo.Plans
WHERE  DATEDIFF(MONTH, cast(cast(PlanStartDate as varchar(8)) as datetime), GETDATE()) <= 6
GROUP BY MONTH(cast(cast(PlanStartDate as varchar(8)) as datetime));
选择SUM(PlanTotal)作为PlanTotal,选择MONTH(cast(cast(PlanStartDate作为varchar(8))作为datetime))
从TEST.dbo.Plans

其中DATEDIFF(MONTH,cast(cast(PlanStartDate作为varchar(8))作为datetime),GETDATE()您的问题可以通过以下简单方法重现:

SELECT  MONTH(20140624) -- TODAY'S DATE AS AN INT
为了解决这个问题,我将以有效的格式存储日期,但如果无法做到这一点,您可以使用以下方法提取月份:

SELECT  FLOOR(20140617 % 1000 / 100)
您的谓词也不是,您在PlanStartDate上可能拥有的任何索引在您将值转换两次后都是无用的,然后将其放入DATEDIFF中。您可以按如下方式重写谓词,以允许使用索引:

WHERE   PlanStartDate >= CONVERT(INT, CONVERT(VARCHAR(6), DATEADD(MONTH, -6, GETDATE()), 112) + '01')
AND     PlanStartdate <= GETDATE();
给出以下内容的最终查询:

SELECT  SUM(PlanTotal) as PlanTotal, FLOOR(20140617 % 1000 / 100) AS Month
FROM    TEST.dbo.Plans
WHERE   PlanStartDate >= CONVERT(INT, CONVERT(VARCHAR(6), DATEADD(MONTH, -6, GETDATE()), 112) + '01')
AND     PlanStartdate <= GETDATE()
GROUP BY FLOOR(20140617 % 1000 / 100);
选择SUM(PlanTotal)作为PlanTotal,选择FLOOR(20140617%1000/100)作为Month
从TEST.dbo.Plans
其中PlanStartDate>=CONVERT(INT,CONVERT(VARCHAR(6),DATEADD(MONTH,-6,GETDATE()),112)+“01”)

和PlanStartdate PlanStartdate的数据类型是什么?;)
CONVERT(INT, CONVERT(VARCHAR(6), DATEADD(MONTH, -6, GETDATE()), 112) + '01')
SELECT  SUM(PlanTotal) as PlanTotal, FLOOR(20140617 % 1000 / 100) AS Month
FROM    TEST.dbo.Plans
WHERE   PlanStartDate >= CONVERT(INT, CONVERT(VARCHAR(6), DATEADD(MONTH, -6, GETDATE()), 112) + '01')
AND     PlanStartdate <= GETDATE()
GROUP BY FLOOR(20140617 % 1000 / 100);