2

使用 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)。上面的查询应该不适合。

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

请向我提供查询。

4

4 回答 4

4

我不会循环创建日期列表,使用数字表(不仅仅是值 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)
于 2009-09-29T13:27:59.440 回答
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 语句或您需要的任何内容。

马克

于 2009-09-29T05:33:16.073 回答
2

看:

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

日历表可以使围绕涉及日期的任何业务模型开发解决方案变得更加容易。最后我检查了一下,在某种程度上,这几乎涵盖了你能想到的任何商业模式。最终需要冗长、复杂和低效方法的持续问题包括以下问题:

  • x和y之间有多少个工作日?
  • ...
于 2009-09-29T08:59:59.143 回答
0

这将使您长达 100,000 天:

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
于 2009-09-29T12:28:24.287 回答