我有以下代码:
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)
有人能看到问题吗?
答案 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)