2016-05-13 18 views
1

我想要做的是從日期字段中選擇*開始日期是9-1-去年和結束日期是8-31-當年,但我不想讓年份具體。如何在SQL Where子句中組合日期部分和文字?

Select * from dbo."TABLE" 
where (Date_Field) between (year(DATEADD(year,-1, getdate())) +'09-01') and ((YEAR(getdate())) +'08-31') 

我得到一個「操作數類型衝突:日期與int不兼容」的錯誤。

+0

「去年」是什麼意思? –

+0

對不起,上一年。 :) –

回答

0

湯姆^ h是正確的。 SQL服務器足夠聰明,可以從字符串中輸入日期,所以

SELECT * from dbo."TABLE" 
WHERE (Date_Field) BETWEEN CONVERT(varchar, YEAR(DATEADD(year, - 1, 
GETDATE()))) + '-09-01' AND CONVERT(varchar, YEAR(GETDATE())) + '-08-31' 

就足夠了。更重要的是,你錯過了-09-01中的領先-,這可能是你在這裏拋出的軌道。

+0

完美工作。謝謝。我必須做的唯一改變是刪除最後一個)'-08-31' –

+0

複製/粘貼;)我將編輯它。謝謝你的代表! – Stack

1

您的查詢的問題是,您正在嘗試將整數和字符串組合起來,然後嘗試將它們用作日期。在很多情況下,您需要明確地指定您的數據類型。此外,您錯過了年份與日期的其餘部分之間的連字符。

WHERE <date_field> BETWEEN 
    CAST(CAST(YEAR(GETDATE()) - 1 AS CHAR(4)) + '-09-01' AS DATETIME) AND 
    CAST(CAST(YEAR(GETDATE()) AS CHAR(4)) + '-08-31' AS DATETIME) 

您還可以通過使用最新的功能和一些數學做到這一點,沒有任何數據類型轉換:

BETWEEN 
    DATEADD(DAY, 30, DATEADD(MONTH, 7, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))) AND 
    DATEADD(MONTH, 8, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0))