t-sql获取2个date之间的所有date
可能重复:
获取date范围之间的date
比方说,我有2个date(只有date部分,没有时间),我想要获取这两个date之间的所有date,并将它们插入表中。 有没有一种简单的方法来做到这一点与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 Server 2005+,使用recursion查询:
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
使用CAST / CONVERT格式,只要你喜欢 。
使用参数开始和结束:
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,那么比使用recursionCTE 更有效 。 只要从缓冲区caching中读取,永久性的效率就会更高。
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)
我只是做了这样的事情:
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
重复的问题
获取date范围之间的date
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);