我有下面的代碼不工作:SQL datefromparts預期
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)
任何人都可以看到這個問題?
我從來沒有見過這麼瘋狂的WHERE子句,你有什麼去做?我懷疑你需要訴諸這樣一個奇怪的操縱,最有可能是一個更好的方式來獲得你的東西。 –
當你已經有日期時,你爲什麼要做'DATEFROMPARTS'?如果你想添加1個月,你應該使用'DATEADD(',修改你的問題以包含期望值。 – 2014-03-24 13:20:23
因爲我試圖從一個月的第一天開始記錄直到給定日期的最後一天。 long DATEFROMPARTS給了我類似於31/1/2014的東西,第二種是2014年1月1日,然後我在這兩個日期之間拉出記錄 –