如何显示所有SQL两个给定日期之间的日期(How to display all the dates

2019-08-17 00:07发布

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

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

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

我所创建的表的名称作为整数,其具有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)。 上面的查询应该不适合的。

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

敬请我提供查询。

Answer 1:

这将让你可达10万日:

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


Answer 2:

我不会循环创建日期列表,用数字表,它们是有用的很多东西(不仅仅是值为0至9的表): http://web.archive.org/web/20150411042510/http ://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html有了一个真正的数字表,你不必CROSS JOIN一堆倍,使查询过于复杂。

对于这种方法的工作,你需要做的这一次表设置:

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)


Answer 3:

一种可能的方式(不是说这是最好的,最有效的)会是这样的:

DECLARE @StartDate DATETIME
SET @StartDate = '06/23/2008'

DECLARE @EndDate DATETIME 
SET @EndDate = '06/30/2008'

DECLARE @TableOfDates TABLE(DateValue DATETIME)

DECLARE @CurrentDate DATETIME

SET @CurrentDate = @startDate

WHILE @CurrentDate <= @endDate
BEGIN
    INSERT INTO @TableOfDates(DateValue) VALUES (@CurrentDate)

    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate)
END

SELECT * FROM @TableOfDates

这将任意数量的日期,日期的任何范围内工作,并不需要一个整数特定的“帮手”表。

它存储所有相关的日期,一个在内存中的表变量,这样你就可以用它来如另一个SELECT语句或任何你需要它。



Answer 4:

看到:

我为什么要考虑使用辅助日历表?

日历表可以使它更容易开发围绕涉及日期的任何业务模式的解决方案。 上次我检查,这包括几乎你能想到的任何商业模式,在一定程度上。 这最终需要冗长,复杂的和低效的方法包括以下几个问题不变的问题:

  • 有多少企业X和Y之间的天数?
  • ...


文章来源: How to display all the dates between two given dates in SQL