查询日期范围

Mic*_*mon 2 sql-server t-sql sql-server-2008-r2 date

我有一个存储过程,我想第一次在@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))
Run Code Online (Sandbox Code Playgroud)

编辑
我想返回的是

01/01/2017
02/12/2017
01/01/2016
12/31/2016
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

不确定您从何处复制此代码,但它看起来像是来自将减号 ( -) 转换为长破折号 ( ) 的网站。如果您打开 IntelliSense,您可以在 Management Studio 中看到这一点:

在此处输入图片说明

以下是比较与前一年相同范围的简单方法:

DECLARE @startdate date = '20170101',
        @enddate   date = '20170212';

SELECT @startdate, DATEADD(YEAR, -1, @startdate),
       @enddate,   DATEADD(YEAR, -1, @enddate);
Run Code Online (Sandbox Code Playgroud)

这与去年同期相比,但我不确定这就是您所追求的,因为您也在使用零日期和 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');
Run Code Online (Sandbox Code Playgroud)

总结:

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');
Run Code Online (Sandbox Code Playgroud)

推荐阅读: