Sql-Server

查詢日期範圍

  • May 7, 2020

我有一個儲存過程,我想首先在@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');

推薦閱讀:

引用自:https://dba.stackexchange.com/questions/164309