Sql-Server
查詢日期範圍
我有一個儲存過程,我想首先在
@startdate
&之間收集數據,@enddate
然後我想將該數據與前一年進行比較。我嘗試了以下語法(顯然是為了測試)以確保在添加到生產語法之前獲得所需的日期輸出。但是,這給了我一個錯誤
消息 102,級別 15,狀態 1,第 11 行
‘–’ 附近的語法不正確。
消息 102,級別 15,狀態 1,第 14 行
‘–’ 附近的語法不正確。
這是我嘗試過的語法。為了輸出我需要的日期,我會改變什麼?
Declare @startdate date = '20170101' ,@enddate date = '20170212' --one year prior to @startdate Select CAST(DateAdd(yy, -1, @startdate) As Date) --One year prior to @enddate SELECT CAST(DateAdd(yy, -1, @enddate) As Date) --This will get first day of prev yr SELECT DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, –1, @startdate)), 0) --This will get last day of prev yr SELECT DATEADD(MILLISECOND, –3, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, –1, @enddate)) + 1, 0))
編輯
我想要返回的是
01/01/2017 02/12/2017 01/01/2016 12/31/2016
不確定您從哪裡複製了此程式碼,但它看起來像是來自將減號 (
-
) 翻譯成長破折號 (–
) 的網站。如果打開 IntelliSense,您可以在 Management Studio 中看到:這是比較與前一年相同範圍的簡單方法:
DECLARE @startdate date = '20170101', @enddate date = '20170212'; SELECT @startdate, DATEADD(YEAR, -1, @startdate), @enddate, DATEADD(YEAR, -1, @enddate);
這與去年同期相比,但我不確定這就是你所追求的,因為你也在使用零日期
datediff
- 不清楚為什麼。它不考慮閏年;如果範圍涉及今年或去年的 2/29,您需要定義應該發生什麼。當您在查詢中使用這些日期時,不要這樣做減去 3 毫秒的廢話 - 它只會導致問題。如果您想獲取 2 月 12 日的所有數據,即使有時間,請使用
< DATEADD(DAY, 1, @enddate)
. 另外,不要使用YY
,只需輸入YEAR
。獲得去年的全系列也容易得多:-- for SQL Server 2012+ WHERE col >= DATEFROMPARTS(YEAR(@startdate)-1, 1, 1) AND col < DATEFROMPARTS(YEAR(@startdate), 1, 1); -- for older, unsupported versions: WHERE col >= DATEADD(YEAR, YEAR(@startdate)-1901, '19000101'), AND col < DATEADD(YEAR, YEAR(@startdate)-1900, '19000101');
總結:
DECLARE @startdate date = '20170101', @enddate date = '20170212'; -- sales from that period this year: SELECT SUM(some_column) FROM dbo.SomeTable WHERE some_datetime_column >= @startdate AND some_datetime_column < DATEADD(DAY, 1, @enddate); -- sales from same period previous year (again, not accounting for leap special case): SELECT SUM(some_column) FROM dbo.SomeTable WHERE some_datetime_column >= DATEADD(YEAR, -1, @startdate) AND some_datetime_column < DATEADD(YEAR, -1, DATEADD(DAY, 1, @enddate)); -- sales from all of previous year: SELECT SUM(some_column) FROM dbo.SomeTable WHERE some_datetime_column >= DATEADD(YEAR, YEAR(@startdate)-1901, '19000101'), AND some_datetime_column < DATEADD(YEAR, YEAR(@startdate)-1900, '19000101');
推薦閱讀: