Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL server为特定范围生成日期_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

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

使用SQL server为特定范围生成日期,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我需要生成特定日期范围的日期,例如从2010年到2050年 我在谷歌上搜索了一下,但没有找到解决办法。如何使用sql server生成日期范围。我需要使用sql查询,而不是使用存储过程和块。 任何帮助都将不胜感激 谢谢创建一个数字/理货表一个值从0到10000的表,比如说,称它为dbo.numbers,然后从那里选择,从每个数字计算一个日期,从1开始,直到您需要的任何数字: SELECT DATEADD(day, n.Number, '2010-01-01') FROM dbo.Numbers

我需要生成特定日期范围的日期,例如从2010年到2050年 我在谷歌上搜索了一下,但没有找到解决办法。如何使用sql server生成日期范围。我需要使用sql查询,而不是使用存储过程和块。 任何帮助都将不胜感激


谢谢

创建一个数字/理货表一个值从0到10000的表,比如说,称它为dbo.numbers,然后从那里选择,从每个数字计算一个日期,从1开始,直到您需要的任何数字:

SELECT DATEADD(day, n.Number, '2010-01-01')
FROM dbo.Numbers AS n
WHERE n < [YourMaxNumberHere]

您可以使用递归CTE在指定的时间段之间生成日期,但建议使用更快、更简单的表解决方案

日期范围有限的演示-


使用数字更好,但需要创建一个DB对象。还可以使用简单的表变量和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

借助一些数学知识,我们可以为生成日期生成足够的数字

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

“40年就是14310天——我认为递归的深度会出现堆栈故障。@Brian编辑了,制作了15000,我没有用maxrecusion 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