列出两个日期范围之间的日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列出两个日期范围之间的日期相关的知识,希望对你有一定的参考价值。

我有表1有3列id,startdate和enddate。如果订单ID是主键,如何列出日期范围Startdate和Enddate之间的日期?

是)我有的:

id     Startdate     EndDate
1      2/11/2014     2/13/2014
2      2/15/2014     2/17/2014

我需要的:

id       Date
1      2/11/2014
1      2/12/2014
1      2/13/2014
2      2/15/2014
2      2/16/2014
2      2/17/2014

我该怎么做呢?

答案

使用递归CTE:

WITH tmp AS (
    SELECT  id, StartDate AS [Date], EndDate
    FROM    MyTable
    UNION ALL
    SELECT  tmp.id, DATEADD(DAY,1,tmp.[Date]), tmp.EndDate
    FROM    tmp
    WHERE   tmp.[Date] < tmp.EndDate
)

SELECT tmp.ID, tmp.[Date]
FROM tmp
ORDER BY tmp.id, tmp.[Date]
OPTION (MAXRECURSION 0) -- For long intervals

如果你必须使用游标/循环,大多数时候你做错了。

另一答案

如果您对Why should I consider using an auxiliary calendar table?所示的辅助日历表进行一次性设置,如果您不需要它们可能会省略很多列,如下所示:

CREATE TABLE dbo.Calendar  
(  
    dt SMALLDATETIME NOT NULL 
        PRIMARY KEY CLUSTERED,  

    Y SMALLINT,  
    M TINYINT,  
    D TINYINT
 ) 
GO

SET NOCOUNT ON 
DECLARE @dt SMALLDATETIME 
SET @dt = '20000101' 
WHILE @dt < '20300101' 
BEGIN 
    INSERT dbo.Calendar(dt) SELECT @dt 
    SET @dt = @dt + 1 
END;

UPDATE dbo.Calendar SET 
    Y = YEAR(dt),  
    M = MONTH(dt),  
    D = DAY(dt);

(您可能根本不需要Y,M,D列,但我留下了这些列以显示可以存储更多数据以便快速访问 - 我链接的文章显示了如何使用它。)

然后,如果您的表名为“so”,那么您的代码就是

SELECT A.id, C.dt
FROM so AS A
JOIN Calendar AS C
ON C.dt >= A.StartDate AND C.dt<= A.EndDate

使用这样的辅助表的一个优点是您的查询可以更快:在设置一个时完成的工作是一次性成本,这在使用期间不会发生。

另一答案

查询下面的查询可用于获取两个日期范围之间的日期列表,而不是使用CTE(在日期范围很大时过度递归和执行)。

DECLARE @StartDateSTR AS VARCHAR(32); DECLARE @EndDateSTR AS VARCHAR(32); DECLARE @EndDate AS DATE; DECLARE @StartDate AS DATE;

SET @StartDateSTR = '01 / 01/1990'; SET @EndDateSTR = '03 / 31/2025'; SET @StartDate = CAST(@StartDateSTR AS date); SET @EndDate = cast(@EndDateSTR AS date); SELECT DATEADD(DAY,n1.rn - 1,@ StartDate)AS dt FROM(SELECT rn = Row_number()OVER(ORDER BY(SELECT NULL))FROM sys.objects一个CROSS JOIN sys.objects b CROSS JOIN sys.objects c CROSS JOIN sys.objects d)as n1 WHERE n1。[rn] <= Datediff(dd,@ StartDate,@ EndDate)+1;

以上是关于列出两个日期范围之间的日期的主要内容,如果未能解决你的问题,请参考以下文章

sql怎样列出一个月的全部日期

在日期范围内按日期聚合数据,结果集中没有日期间隔

斯威夫特:如何设置两个日期之间的照片范围?

列出两个日期之间对 master 分支的 git 提交

如何在每个日期的两个日期范围之间获取 obj

在codeigniter中获取两个日期范围之间的数据