使用SQL Server为特定范围生成日期

时间:2017-09-12 06:10:21

标签: sql sql-server sql-server-2012

我需要生成特定日期范围的日期,例如从2010年到2050年 我用谷歌搜索,但没有找到解决方案。我如何使用sql server生成日期范围。我需要使用sql查询不使用存储过程和块。 任何帮助都会受到欢迎。

谢谢

4 个答案:

答案 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