sql datefromparts没有按预期工作

时间:2014-03-24 13:15:14

标签: sql sql-server-2012

我有以下代码:

Declare @indDate date = '1/1/2014'

SELECT  RecordID AS RID,
            Name, 
            Company, 
            PhoneNumber, 
            CONVERT(VARCHAR(10),DateOfInduction,103) AS StartDate,
            CONVERT(VARCHAR(10),DateOfExpiry,103) AS DateOfExpiry
    FROM Records WHERE DateOfExpiry <= DATEFROMPARTS(DATEPART(YYYY,@indDate),DATEPART(MM,@indDate),DATEPART(DD,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@indDate)+1,0))))
    AND DateOfExpiry >= DATEFROMPARTS(DATEPART(YYYY,@indDate),DATEPART(MM,@indDate),1)

这基本上为我提供了@indDate参数月份的所有过期记录。

我要做的是在DATEFROMPARTS中添加1来获取下个月的值。现在我不想只将@indDate更改为另一个月,因为在报告中不会选择日期,只会选择本月,下个月,上个月等过期

因此,如果我将WHERE子句更改为:

WHERE DateOfExpiry <= DATEFROMPARTS(DATEPART(YYYY,@indDate),DATEPART(MM,DATEADD(MM,1,@indDate)),DATEPART(DD,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@indDate)+1,0))))
    AND DateOfExpiry >= DATEFROMPARTS(DATEPART(YYYY,@indDate),DATEPART(MM,DATEADD(MM,1,@indDate)),1)

我收到错误:Cannot construct data type date, some of the arguments have values which are not valid.我不知道为什么,它可以正常工作如果我尝试这样的话:

Declare @indDate date = '1/1/2014'
select DATEADD(mm,1,@indDate)

有人能看到问题吗?

2 个答案:

答案 0 :(得分:2)

您的错误来自于尝试从无效日期范围创建日期,

如果您按以下方式运行部分DATEFROMPARTS

DECLARE @indDate DATE = '1/1/2014'
SELECT DATEPART(YYYY, @indDate)
       ,DATEPART(MM, DATEADD(MM, 1, @indDate))
       ,DATEPART(DD, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @indDate) + 1, 0)))

这会生成2014 2 31,这不是有效日期。

以下三个示例将为您提供上一个,当前或下个月的所有记录,无论您是否已通过'01/01/2014''01/15/2014'

这将为您提供上个月的所有记录。

WHERE DateOfExpiry >= DATEADD(MONTH, -1,DATEADD(dd,-DATEPART(day,@indDate)+1,@indDate)) AND
DateOfExpiry < DATEADD(dd,-DATEPART(day,@indDate)+1,@indDate)

这将为您提供当月的所有记录

WHERE DateOfExpiry >= DATEADD(dd,-DATEPART(day,@indDate)+1,@indDate) 
and DateOfExpiry < DATEADD(MONTH, 1,DATEADD(dd,-DATEPART(day,@indDate)+1,@indDate))

最后所有下个月的记录

WHERE DateOfExpiry >=  DATEADD(MONTH, 1, DATEADD(dd, -DATEPART(day, @indDate) + 1, @indDate))
AND DateOfExpiry < DATEADD(MONTH, 2, DATEADD(dd, -DATEPART(day, @indDate) + 1, @indDate))

答案 1 :(得分:0)

为什么不使用:

WHERE DateOfExpiry >= @indDate AND DateOfExpiry < DATEADD(month,1,@indDate)