0

我正在尝试创建一个表,该表由以下列组成:

  • DateID,它应该从 20130101 开始计数。(2013 年 1 月 1 日)并结束于 20131231(2013 年 12 月 31 日)。

  • Year,它必须保持 2013 年(使用 VALUE 易于处理)。

  • Month,它应该从 01 开始计数,到 12 结束。
  • Day,它应该从 01 开始计数,到 28、30 和 31 结束。

自动增量必须考虑对实际日期的依赖。

更确切地说:

自动增量必须将 ID 增加 1 并在 31(1 月 31 日)停止

然后它应该开始将月份增加 1。

之后它应该再次切换到当天并将其增加 1,直到达到 2 月 28 日。然后它应该再次开始增加月份......等等。

当然,“月”栏和“日”栏是一样的。

有没有可能做这样的事情?

4

3 回答 3

2

要回答您的基本问题,不,没有办法像那样“操纵”自动增量。它可以有一个恒定的种子值和恒定的增量,但仅此而已。您可以使用“重置”增量种子的触发器来操作它INSERT,但我不推荐它。

您不需要自动增量 - 您可以从日期计算年、月和日:

DECLARE @thedate DateTime
SELECT @thedate = GETDATE()  -- or whatever date you want to insert

INSERT INTO MyDates
([DateID], [Year],[Month], [Day])
VALUES (
    YEAR(@thedate)*10000 + MONTH(@thedate) * 100 + DAY(@thedate),               
    YEAR(@thedate),
    MONTH(@thedate),
    DAY(@thedate)
)

现在您只需要一个循环来插入所有日期。

于 2013-10-28T14:16:24.677 回答
1

您可以使用递归CTE来构建它

WITH dates AS
(
    SELECT CAST('20130101' AS DATE) AS DateKey
    UNION ALL
    SELECT DATEADD(D, 1, DateKey)
    FROM dates
    WHERE DATEADD(D, 1, DateKey) < '20140101'
)

SELECT DateKey, YEAR(DateKey) [Year], MONTH(DateKey) [Month], DAY(DateKey) [Day]
INTO Calendar
from dates
OPTION (MAXRECURSION 0)

SELECT * FROM Calendar 
于 2013-10-28T14:20:13.010 回答
1

A recursive CTE can do this for you:

DECLARE @dates TABLE (
    isodate varchar(8),
    theyear int,
    themonth int,
    thedate int
);

WITH datecte AS (
    SELECT 0 AS cnt, CAST('1 Jan 1900' AS DATE) AS startdate
    UNION ALL
    SELECT cnt + 1, DATEADD(D, 1, startdate) 
        FROM datecte 
        WHERE DATEADD(D, 1, startdate) < '1 Jan 2000'
)
INSERT INTO @dates (isodate, theyear, themonth, thedate)
    SELECT CONVERT(varchar(8), startdate, 112), 
            YEAR(startdate), 
            MONTH(startdate), 
            DAY(startdate)
        FROM datecte
        OPTION (MAXRECURSION 0)


SELECT * FROM @dates
于 2013-10-28T14:21:10.110 回答