sql - 如何在SQL中显示两个给定日期之间的所有日期

标签 sql sql-server tsql sql-server-2000 gaps-and-islands

使用 SQL Server 2000。如果开始日期是 06/23/2008,结束日期是 06/30/2008

然后我需要查询的输出作为

06/23/2008
06/24/2008
06/25/2008
.
.
.
06/30/2008

我创建了一个名为 Integer 的表,它有 1 列,列值为 0、1、2、3、4、5、6、7、8、9 然后我使用了下面提到的查询

尝试查询

SELECT DATEADD(d, H.i * 100 + T .i * 10 + U.i, '" & dtpfrom.Value & "') AS Dates 
  FROM integers H 
CROSS JOIN integers T 
CROSS JOIN integers U 
order by dates

以上查询仅显示 999 个日期。 999 个日期仅指 (365 + 365 + 269) 个日期。假设我想选择超过 3 年(01/01/2003 到 01/01/2008)。上面的查询应该不合适。

如何修改我的查询?或者任何其他查询都可用于上述条件。

请向我提供查询。

最佳答案

我不会循环创建日期列表,而是使用数字表(不仅仅是值 0 到 9 的表),它们对很多事情都很有用:http://web.archive.org/web/20150411042510/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html使用真正的 Numbers 表,您不必多次交叉连接并使查询过于复杂。

要使此方法起作用,您需要进行一次时间表设置:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.columns s1
    CROSS JOIN sys.columns s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

设置 Numbers 表后,使用此查询:

SELECT
    @Start+Number-1
    FROM Numbers
    WHERE Number<=DATEDIFF(day,@Start,@End)+1

要捕获它们,请执行以下操作:

DECLARE  @Start datetime
         ,@End  datetime
DECLARE @AllDates table
        (Date datetime)

SELECT @Start = '06/23/2008', @End = '06/30/2008'

INSERT INTO @AllDates
        (Date)
    SELECT
        @Start+Number-1
        FROM Numbers
        WHERE Number<=DATEDIFF(day,@Start,@End)+1

SELECT * FROM @AllDates

输出:

Date
-----------------------
2008-06-23 00:00:00.000
2008-06-24 00:00:00.000
2008-06-25 00:00:00.000
2008-06-26 00:00:00.000
2008-06-27 00:00:00.000
2008-06-28 00:00:00.000
2008-06-29 00:00:00.000
2008-06-30 00:00:00.000

(8 row(s) affected)

关于sql - 如何在SQL中显示两个给定日期之间的所有日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1490566/

相关文章:

php - SQL查询将两列与另一表中的一列进行比较(并获取两个值)

sql - 如何在 MERGE INTO 语句中使用 JOIN?

sql-server - 在 SQL Server 中创建主 key

sql-server - TSQL 查找重叠时间

mysql - SQL:具有 10 个字段的表,其中包含来自其他表的 ID 或 0(内部或左连接到 "read"表?)

mysql - SQL 查询按列值分组,并将 o/p 作为单独的列

.net - 如何在 SQL Server 2012 的 SQLCLR 程序集中使用 TimeZoneInfo

sql - 在 T-SQL/SQL SERVER 中排序(或使用 ORDER BY 子句)而不考虑某些单词

sql - 分段的 DAU/MAU 计算

c# - 带有自定义存储过程的 EF 6 代码优先