如何在 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)

“FirstOfMonth”是一个用户定义的函数,我做了它几乎可以做到它所说的,返回提供日期的月份的第一天,时间正好是午夜。

这几乎完全符合我的需要,直到我发现我的日期偶尔会有几个月的空白,因为没有记录插入日期。由于我的结果必须仍然缺少几个月,因此我需要一种不同的方法。

我已将以下声明添加到存储过程中,以预期他们需要我需要的日期范围…

 declare $startDate set $startDate = select min(InsertDate) from customer
declare $endDate set $endDate = select max(InsertDate) from customer

…但我不知道从这里做什么。

我知道这个问题 与这个问题相似, 但坦率地说,这个答案超出了我的想象(我不经常使用 SQL,而且当我这样做时,它往往是在旧版本的 SQL Server 上)并且有一些次要的让我失望的差异。

原文由 Sailing Judo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 655
2 个回答

这将很快填充一个包含 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

然后,您可以通过 LEFT 加入该表来使用它,用于您需要的日期范围。

原文由 MatBailie 发布,翻译遵循 CC BY-SA 3.0 许可协议

SELECT  P.Id
      , DATEADD ( DD, -P.Id, P.Date ) AS Date
    FROM  (SELECT TOP 1000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) AS Id, CAST(GETDATE () AS DATE) AS Date FROM master.dbo.spt_values) AS P

此查询返回最近 1000 天左右的表日历。它可以放在临时表或其他表中。

原文由 Lunas Allen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进