可能是重复问题:
获取日期范围内的所有日期
假设我有两个日期(只有日期部分,没有时间),我想得到这两个日期之间的所有日期(包括这两个日期),然后将它们插入到表格中。是否有一种简单的 SQL 语句实现它(即不使用循环)?
Ex:
Date1: 2010-12-01
Date2: 2010-12-04
Table should have following dates:
2010-12-01, 2010-12-02, 2010-12-03, 2010-12-04
可能是重复问题:
获取日期范围内的所有日期
假设我有两个日期(只有日期部分,没有时间),我想得到这两个日期之间的所有日期(包括这两个日期),然后将它们插入到表格中。是否有一种简单的 SQL 语句实现它(即不使用循环)?
Ex:
Date1: 2010-12-01
Date2: 2010-12-04
Table should have following dates:
2010-12-01, 2010-12-02, 2010-12-03, 2010-12-04
WITH sample AS (
SELECT CAST('2010-12-01' AS DATETIME) AS dt
UNION ALL
SELECT DATEADD(dd, 1, dt)
FROM sample s
WHERE DATEADD(dd, 1, dt) <= CAST('2010-12-04' AS DATETIME))
SELECT *
FROM sample
dt
---------
2010-12-01 00:00:00.000
2010-12-02 00:00:00.000
2010-12-03 00:00:00.000
2010-12-04 00:00:00.000
INSERT INTO dbo.YOUR_TABLE
(datetime_column)
WITH sample AS (
SELECT @start_date AS dt
UNION ALL
SELECT DATEADD(dd, 1, dt)
FROM sample s
WHERE DATEADD(dd, 1, dt) <= @end_date)
SELECT s.dt
FROM sample s
你需要一个数字表。如果你没有永久性的数字表,这是一种更有效的生成方法,而不是使用递归CTE。但只要从缓存区读取就可以了,永久性的数字表会更有效。
DECLARE @D1 DATE = '2010-12-01'
DECLARE @D2 DATE = '2010-12-04'
;WITH
L0 AS (SELECT 1 AS c UNION ALL SELECT 1),
L1 AS (SELECT 1 AS c FROM L0 A CROSS JOIN L0 B),
L2 AS (SELECT 1 AS c FROM L1 A CROSS JOIN L1 B),
L3 AS (SELECT 1 AS c FROM L2 A CROSS JOIN L2 B),
L4 AS (SELECT 1 AS c FROM L3 A CROSS JOIN L3 B),
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS i FROM L4)
SELECT DATEADD(day,i-1,@D1)
FROM Nums where i <= 1+DATEDIFF(day,@D1,@D2)
ROW_NUMBER()
为它们提供了索引。 - freedomn-m我刚刚做了类似这样的事情:
declare @dt datetime = '2010-12-01'
declare @dtEnd datetime = '2010-12-04'
WHILE (@dt < @dtEnd) BEGIN
insert into table(datefield)
values(@dt)
SET @dt = DATEADD(day, 1, @dt)
END
重复的问题
DECLARE @DateFrom smalldatetime, @DateTo smalldatetime;
SET @DateFrom='20000101';
SET @DateTo='20081231';
-------------------------------
WITH T(date)
AS
(
SELECT @DateFrom
UNION ALL
SELECT DateAdd(day,1,T.date) FROM T WHERE T.date < @DateTo
)
SELECT date FROM T OPTION (MAXRECURSION 32767);
OPTION (MAXRECURSION 0)
以避免出现The statement terminated. The maximum recursion 100 has been exhausted before statement completion
错误。 - Alexander Abakumov