如何在SQL Server 2000中生成一个填充日期的临时表?

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加入该表来使用它,以满足您所需的日期范围.

  • 我不得不使用基于它的CalendarMonths表来使其工作:`INSERT INTO @CalendarMonths SELECT @ basedate`我还将表更改为表变量,以便它也是临时的和内存中的. (3认同)
  • @edmicman - 为什么是临时的?如果您不止一次使用它,当然值得坚持/缓存吗? (2认同)
  • 在我的特定情况下,我想获得输入日期范围内的月/年列表。也许静态表会很好,但我并没有经常遇到这种需要,以至于在运行中创建它是一个问题。 (2认同)
  • @PeterTirrell - 表变量不存储在内存中,它作为临时表存储在磁盘上. (2认同)

kar*_*ato 5

这当然不适用于 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)