3

日付が別のリスト (休日) に表示されない 2 つの日付 (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

これにより、2 つの日付の間の日付のリストが表示されます。ただし、休日のリストにない日を取り出して数えたいと思います。

ありがとう、

ファーストケープ

4

1 に答える 1

2

これを試してみてください -

クエリ 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
...
于 2013-06-04T07:48:37.400 に答える