【问题标题】:How to display tabular record of dates from date range如何显示日期范围内日期的表格记录
【发布时间】:2019-01-29 13:06:34
【问题描述】:

我有 3 条记录结构的请求表:Id、DateFrom、DateTo

Id  DateFrom    DateTo
1   15/01/2019  15/01/2019
2   21/01/2019  28/01/2019
3   04/02/2019  09/02/2019

And I want an output like this:
Id  Date
1   15/01/2019
2   21/01/2019
2   22/01/2019
2   23/01/2019
2   24/01/2019
2   25/01/2019
2   26/01/2019
2   27/01/2019
2   28/01/2019
3   04/02/2019
3   05/02/2019
3   06/02/2019
3   07/02/2019
3   08/02/2019
3   09/02/2019

我创建了一个表值函数来显示一系列基于日期的 DateFrom 和 DateTo。

CREATE FUNCTION [dbo].[tvfhrms_Calendar_DateRange](@DateFrom date, @DateTo date)
RETURNS @DateOfTheYear Table(Level int,SysDate date)
AS
BEGIN
    WITH AllDays
          AS (  
                SELECT  [Level] = 1 
                ,[Date] = @DateFrom

                UNION ALL

                SELECT [Level] = [Level] + 1
                ,[Date] = DATEADD(DAY, 1, [Date])
                FROM     AllDays
                WHERE    [Date] < @DateTo 
             )
    INSERT @DateOfTheYear
    SELECT [Level]
    ,[SysDate]=[Date]
    FROM   AllDays OPTION (MAXRECURSION 0)
    RETURN
END

那么在select查询中使用时,

SELECT sysdate from [dbo].[tvfhrms_Calendar_DateRange]('2019-01-10', '2019-02-09')

这将给出 Datefrom 到 DateTo 序列的结果。 如何将其集成到我的表中,以便我可以得到符合我期望的输出?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您可以使用APPLY

    SELECT tt.*
    FROM table t CROSS APPLY
         (SELECT tt.*
          FROM [dbo].[tvfhrms_Calendar_DateRange] (t.datefrom, t.dateto) AS tt
         ) tt;
    

    【讨论】:

    • 这真的很快。太好了!
    【解决方案2】:

    不需要有额外的日期表。请注意,我的日期格式不同。

       DECLARE @t TABLE (Id INT, DateFrom DATE, DateTo DATE)
        INSERT INTO @t VALUES
        (1,'01/15/2019','01/15/2019'),
        (2,'01/21/2019','01/28/2019'),
        (3,'02/04/2019','02/09/2019')
    
    ;WITH cte as (
        SELECT ID, [Date] = DateFrom FROM @t 
        UNION ALL
        SELECT t.ID, DATEADD(DAY,1,[Date]) FROM @t as t
        INNER JOIN cte ON t.ID = cte.ID and cte.[Date] < t.DateTo
    )
    SELECT * FROM cte
    ORDER BY ID
    

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多