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)
不确定您从何处复制此代码,但它看起来像是来自将减号 ( -
) 转换为长破折号 ( –
) 的网站。如果您打开 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)
推荐阅读:
归档时间: |
|
查看次数: |
443 次 |
最近记录: |