我需要生成特定日期范围的日期,例如从2010年到2050年 我用谷歌搜索,但没有找到解决方案。我如何使用sql server生成日期范围。我需要使用sql查询不使用存储过程和块。 任何帮助都会受到欢迎。
谢谢
答案 0 :(得分:1)
创建一个数字/计数表(一个值为0到10,000的表,让我们说),称之为dbo.Numbers,然后从那里选择,从每个数字计算一个日期,从1开始向上无论你需要什么数字:
SELECT DATEADD(day, n.Number, '2010-01-01')
FROM dbo.Numbers AS n
WHERE n < [YourMaxNumberHere]
答案 1 :(得分:0)
您可以使用递归CTE在指定的时间段内生成日期,但建议使用calendar表,这可能是更快,更简单的解决方案。
日期范围有限的演示 - http://rextester.com/XXUVO70452
Declare @StartDate as DATE = '2010-01-01'
,@EndDate as DATE = '2050-12-31'
;WITH DateRange As
(
SELECT @StartDate as N
UNION ALL
SELECT DATEADD(DAY, 1, N)
FROM DateRange
WHERE DATEADD(DAY, 1, N) < @EndDate
)
SELECT * From DateRange OPTION (MAXRECURSION 15000);
答案 2 :(得分:0)
使用数字更好,但您需要创建一个数据库对象。您还可以使用简单的表变量和WHILE循环
DECLARE @tbl TABLE(
DateValue DATETIME
)
DECLARE @startDate DATETIME = '2010-01-01'
DECLARE @endDate DATETIME = '2050-01-01'
DECLARE @seqDays INT;
SELECT @seqDays = DATEDIFF(d, @startDate,@endDate)
DECLARE @val INT = 1
WHILE(@val <= @seqDays)
BEGIN
INSERT INTO @tbl VALUES(DATEADD(day, @val, @startDate))
SET @val = @val + 1
END
SELECT * FROM @tbl
或者对于@Dymeng的另一个答案中描述的数字表选项,您可以创建自己的表变量并加入其中。您也可以使用SEQUENCE,但这样做会更简单。
DECLARE @tbl TABLE(
DateValue DATETIME
)
DECLARE @startDate DATETIME = '2010-01-01'
DECLARE @endDate DATETIME = '2050-01-01'
DECLARE @seqDays INT;
SELECT @seqDays = DATEDIFF(d, @startDate,@endDate)
DECLARE @tbl TABLE(
DateInc INT IDENTITY(1,1)
)
DECLARE @val INT = 1
WHILE(@val <= @seqDays)
BEGIN
INSERT INTO @tbl DEFAULT VALUES
SET @val= @val + 1
END
SELECT DATEADD(day, a.DateValue, @startDate) FROM @tbl a
答案 3 :(得分:0)
借助一些数学帮助,我们可以生成足够的数字来生成日期。
DECLARE @BeginDate DATETIME ='20100101'
DECLARE @EndDate DATETIME ='20500101'
DECLARE @Day INT = DATEDIFF( DAY, @BeginDate, @EndDate);
DECLARE @P INT = FLOOR( LOG( @Day, 2 ))
;WITH Base AS ( SELECT * FROM (VALUES(1),(2)) N (ID))
,Numbers AS (
SELECT 1 I FROM Base
UNION ALL
SELECT I+1 AS I FROM Base CROSS JOIN Numbers WHERE I < @P
)
, DateRange AS
(
SELECT DATEADD(DAY, ROW_NUMBER() OVER(Order BY I), @BeginDate) DateValue FROM Numbers
)
SELECT * FROM DateRange WHERE DateValue < @EndDate