Sai*_*udo 11 sql t-sql stored-procedures sql-server-2000
我需要创建一个包含日期范围的临时表,以及一些包含占位符值(0)以供将来使用的列.我需要的日期是$ startDate和$ endDate之间每个月的第一天,这些变量可能相隔数年.
我原来的sql语句看起来像这样:
select dbo.FirstOfMonth(InsertDate) as Month, 0 as Trials, 0 as Sales
into #dates
from customer
group by dbo.FirstOfMonth(InsertDate)
Run Code Online (Sandbox Code Playgroud)
"FirstOfMonth"是一个用户定义的函数,它完全按照它所说的做,返回当月的第一天所提供的日期,时间恰好是午夜.
这几乎完全是我所需要的,直到我发现我的日期偶尔会出现间隙,我有几个月没有记录插入日期.由于我的结果仍然缺少几个月,我需要一个不同的方法.
我已经向存储过程添加了以下声明,预计它们需要我需要的日期范围...
declare $startDate set $startDate = select min(InsertDate) from customer
declare $endDate set $endDate = select max(InsertDate) from customer
Run Code Online (Sandbox Code Playgroud)
......但我不知道该怎么做.
我知道这个问题与这个问题类似,但是坦率地说,这个答案已经过去了(我不经常使用SQL,当我这样做时,它往往是在旧版本的SQL Server上)并且有一些小问题差点让我失望.
Clu*_*Ace 23
我需要类似的东西,但是所有的DAYS而不是所有的MONTHS.
使用MatBailie中的代码作为起点,这是用于创建永久表的SQL,其中包含2000-01-01到2099-12-31之间的所有日期:
CREATE TABLE _Dates (
d DATE,
PRIMARY KEY (d)
)
DECLARE @dIncr DATE = '2000-01-01'
DECLARE @dEnd DATE = '2100-01-01'
WHILE ( @dIncr < @dEnd )
BEGIN
INSERT INTO _Dates (d) VALUES( @dIncr )
SELECT @dIncr = DATEADD(DAY, 1, @dIncr )
END
Run Code Online (Sandbox Code Playgroud)
Mat*_*lie 14
这将很快填充一张170年的日期表.
CREATE TABLE CalendarMonths (
date DATETIME,
PRIMARY KEY (date)
)
DECLARE
@basedate DATETIME,
@offset INT
SELECT
@basedate = '01 Jan 2000',
@offset = 1
WHILE (@offset < 2048)
BEGIN
INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, date) FROM CalendarMonths
SELECT @offset = @offset + @offset
END
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过LEFT加入该表来使用它,以满足您所需的日期范围.
这当然不适用于 SQL-Server 2000,但适用于您不想创建永久表的现代数据库。您可以使用表变量而不是创建表,以便可以左连接数据尝试此操作。将 DAY 更改为 HOUR 等以更改增量类型。
declare @CalendarMonths table (date DATETIME, PRIMARY KEY (date)
)
DECLARE
@basedate DATETIME,
@offset INT
SELECT
@basedate = '01 Jan 2014',
@offset = 1
INSERT INTO @CalendarMonths SELECT @basedate
WHILE ( DATEADD(DAY, @offset, @basedate) < CURRENT_TIMESTAMP)
BEGIN
INSERT INTO @CalendarMonths SELECT DATEADD(HOUR, @offset, date) FROM @CalendarMonths where DATEADD(DAY, @offset, date) < CURRENT_TIMESTAMP
SELECT @offset = @offset + @offset
END
Run Code Online (Sandbox Code Playgroud)