【问题标题】:Select difference of days between two dates where date is not in a list选择日期不在列表中的两个日期之间的天差
【发布时间】:2013-06-04 07:45:55
【问题描述】:

我想选择两个日期(startDate 和 endDate)之间的日期列表,其中日期不会出现在单独的列表中(假期)。

例如我用过的:

select dateadd(day, number, StartDate)
from 
    (select distinct number from master.dbo.spt_values
        where name is null
    ) n
where dateadd(day, number, StartDate) < EndDate

这给了我两个日期之间的日期列表。但是,我想取出并计算不在假期日期列表中的天数。

谢谢,

第一角

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试这个 -

    查询 1:

    DECLARE 
          @DateFrom DATETIME
        , @DateTo DATETIME
    
    SELECT 
          @DateFrom = '20130101'
        , @DateTo = '20130131'
    
    DECLARE @holidays TABLE ([Date] DATETIME)
    INSERT INTO @holidays ([Date])
    VALUES ('20130101')
    
    SELECT [Date]
    FROM (
        SELECT [Date] = DATEADD(DAY, sv.number, t.DateFrom)
        FROM (
            SELECT 
                  DateFrom = @DateFrom
                , diff = DATEDIFF(DAY, @DateFrom, @DateTo)
        ) t
        JOIN [master].dbo.spt_values sv ON sv.number <= diff
        WHERE sv.[type] = 'p'
    ) t2
    WHERE t2.[Date] NOT IN (SELECT h.[Date] FROM @holidays h)
    

    查询 2:

    SELECT t2.[Date]
    FROM (
        SELECT [Date] = DATEADD(DAY, sv.number, t.DateFrom)
        FROM (
            SELECT 
                  DateFrom = @DateFrom
                , diff = DATEDIFF(DAY, @DateFrom, @DateTo)
        ) t
        JOIN [master].dbo.spt_values sv ON sv.number <= diff
        WHERE sv.[type] = 'p'
    ) t2
    LEFT JOIN @holidays h ON h.[Date] = t2.[Date]
    WHERE h.[Date] IS NULL
    

    输出:

    Date
    -----------------------
    2013-01-02 00:00:00.000
    2013-01-03 00:00:00.000
    2013-01-04 00:00:00.000
    2013-01-05 00:00:00.000
    2013-01-06 00:00:00.000
    2013-01-07 00:00:00.000
    2013-01-08 00:00:00.000
    ...
    

    【讨论】:

    • 感谢这适用于设定的日期,但我需要为具有不同开始和结束日期的多个成员执行此操作?例如带有 ID 列表以及开始和结束日期的单独查询。
    • 请提供您的数据以及开始和结束日期。
    • 好的抱歉忽略最后一条评论。我被我需要的一些额外数据弄糊涂了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2011-11-03
    • 2017-03-07
    相关资源
    最近更新 更多