2014-03-24 29 views
0

我有下面的代碼不工作: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) 

任何人都可以看到這個問題?

+0

我從來沒有見過這麼瘋狂的WHERE子句,你有什麼去做?我懷疑你需要訴諸這樣一個奇怪的操縱,最有可能是一個更好的方式來獲得你的東西。 –

+0

當你已經有日期時,你爲什麼要做'DATEFROMPARTS'?如果你想添加1個月,你應該使用'DATEADD(',修改你的問題以包含期望值。 – 2014-03-24 13:20:23

+0

因爲我試圖從一個月的第一天開始記錄直到給定日期的最後一天。 long DATEFROMPARTS給了我類似於31/1/2014的東西,第二種是2014年1月1日,然後我在這兩個日期之間拉出記錄 –

回答

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)) 
+0

看起來對我來說很複雜 –

0

爲什麼不使用:

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