Mic*_*mon 5 sql-server t-sql sql-server-2008-r2
我想在 2017 年提取一个日期范围的数据,然后提取相同的日期范围,但在 2016 年。我以为我会变得狡猾并使用DateAdd()功能,但我在这里错过了一些东西,因为我收到错误
消息 241,级别 16,状态 1,第 14 行
从字符串转换日期和/或时间时转换失败。
我想要做的是COUNT(saledate)在时间段之间获得一个秋天,这将给我销售数量。这是示例 DDL
Declare @startdate varchar(100), @enddate varchar(100), @prevyrstartdate varchar(100), @prevyrenddate varchar(100)
SET @startdate = '01/01/2017'
SET @enddate = '01/31/2017'
SET @prevyrstartdate = CAST(DateAdd(yy, -1, @startdate) As Date)
Set @prevyrenddate = CAST(DateAdd(yy, -1, @enddate) As Date)
Declare @HoldingPattern Table
(
salesman varchar(100)
,saledate date
)
Insert Into @HoldingPattern (salesman, saledate) VALUES
('BOB', '2017-01-23')
,('BOB', '2017-01-30')
,('BOB', '2017-01-24')
,('BOB', '2017-01-30')
,('BOB', '2017-01-30')
,('BOB', '2017-01-30')
,('BOB', '2017-02-30')
,('BOB', '2017-02-27')
,('BOB', '2017-03-31')
,('BOB', '2017-03-27')
,('BOB', '2016-01-23')
,('BOB', '2016-01-30')
,('BOB', '2016-01-24')
,('BOB', '2016-01-30')
,('BOB', '2016-03-30')
,('BOB', '2016-03-30')
,('BOB', '2016-03-30')
,('BOB', '2016-02-27')
,('BOB', '2016-02-31')
,('BOB', '2016-02-27')
Select
salesman
,[2017 Data] = (Select COUNT(CAST(saledate As nvarchar(100))) FROM @HoldingPattern where saledate between @startdate AND @enddate)
,[2016 Data] = (Select COUNT(CAST(saledate As nvarchar(100))) FROM @HoldingPattern where saledate between @prevyrstartdate and @prevyrstartdate)
FROM @HoldingPattern
Run Code Online (Sandbox Code Playgroud)
撇开错误数据、错误数据类型和错误格式不谈,如果您要获取当前和上一年的一个月数据,则不需要四个变量;一个会做。但它应该是一个日期,而不是一个字符串。我还建议避免,BETWEEN因为它只适用于极其有限的情况。
DECLARE @startdate date = '20170101';
DECLARE @HoldingPattern TABLE
(
salesman varchar(100),
saledate date
);
-- let's ignore the illogical dates
INSERT @HoldingPattern (salesman, saledate) VALUES
('BOB', '20170123'),('BOB', '20170130'),('BOB', '20170124'),
('BOB', '20170130'),('BOB', '20170130'),('BOB', '20170130'),
/*('BOB', '20170230'),*/('BOB', '20170227'),('BOB', '20170331'),
('BOB', '20170327'),('BOB', '20160123'),('BOB', '20160130'),
('BOB', '20160124'),('BOB', '20160130'),('BOB', '20160330'),
('BOB', '20160330'),('BOB', '20160330'),('BOB', '20160227'),
/*('BOB', '20160231'),*/('BOB', '20160227');
SELECT
Salesman,
[2017 Data] = COUNT(CASE WHEN saledate >= @startdate
AND saledate < DATEADD(MONTH, 1, @startdate) THEN 1 END),
[2016 Data] = COUNT(CASE WHEN saledate >= DATEADD(YEAR, -1, @startdate)
AND saledate < DATEADD(YEAR, -1, DATEADD(MONTH, 1, @startdate)) THEN 1 END)
FROM @HoldingPattern
GROUP BY Salesman;
Run Code Online (Sandbox Code Playgroud)
结果:
Salesman 2017 Data 2016 Data
-------- --------- ---------
BOB 6 4
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
| 归档时间: |
|
| 查看次数: |
4616 次 |
| 最近记录: |