복붙노트

[SQL] 2 개 날짜 매개 변수를 포함하는 가장 쉬운 사이의 날짜와 임시 테이블을 채우는 방법 및

SQL

2 개 날짜 매개 변수를 포함하는 가장 쉬운 사이의 날짜와 임시 테이블을 채우는 방법 및

어떤 것은 날짜를 포함한 2 개 날짜 매개 변수 사이에 임시 테이블을 채우는 가장 쉬운 방법입니다. 난 단지 달 날짜의 1 일이 필요합니다.

그래서 예를 들어 @StartDate = '2011-01-01'와 @EndDate = '2011-08-01'을하는 경우

그럼이 표에 반환 할

2011-01-01
2011-02-01
2011-03-01
2011-04-01
2011-05-01
2011-06-01
2011-07-01
2011-08-01

해결법

  1. ==============================

    1.이것은 @StartDate이 달의 첫 번째없는 경우에도 작동합니다. 나는 달의 시작이 아니라면, 당신은 다음 달의 첫 번째 시작하려는 있으리라 믿고있어. 그렇지 않으면 하나를 제거 :

    이것은 @StartDate이 달의 첫 번째없는 경우에도 작동합니다. 나는 달의 시작이 아니라면, 당신은 다음 달의 첫 번째 시작하려는 있으리라 믿고있어. 그렇지 않으면 하나를 제거 :

    ;WITH cte AS (
    SELECT CASE WHEN DATEPART(Day,@StartDate) = 1 THEN @StartDate 
                ELSE DATEADD(Month,DATEDIFF(Month,0,@StartDate)+1,0) END AS myDate
    UNION ALL
    SELECT DATEADD(Month,1,myDate)
    FROM cte
    WHERE DATEADD(Month,1,myDate) <=  @EndDate
    )
    SELECT myDate
    FROM cte
    OPTION (MAXRECURSION 0)
    
  2. ==============================

    2.

    declare @StartDate date = '2014-01-01';
    declare @EndDate date = '2014-05-05';
    
    ;WITH cte AS (
        SELECT @StartDate AS myDate
        UNION ALL
        SELECT DATEADD(day,1,myDate) as myDate
        FROM cte
        WHERE DATEADD(day,1,myDate) <=  @EndDate
    )
    SELECT myDate
    FROM cte
    OPTION (MAXRECURSION 0)
    
  3. ==============================

    3.

    declare @StartDate datetime
    declare @EndDate datetime
    select @StartDate = '2011-01-01' ,  @EndDate = '2011-08-01'
    
    select @StartDate= @StartDate-(DATEPART(DD,@StartDate)-1)
    
    declare @temp  table
    (
    TheDate datetime
    )
    while (@StartDate<=@EndDate)
    begin
    insert into @temp
    values (@StartDate )
    select @StartDate=DATEADD(MM,1,@StartDate)
    end
    select * from @temp
    

    @StartDate이 달 1 일이 아닌 경우에도 STARTDATE의 달의 첫 날에 다시 이동하여 작동

  4. ==============================

    4.이 SQL 2008 R2에서 테스트

    이 SQL 2008 R2에서 테스트

    Declare @StartDate datetime = '2015-03-01'
    Declare @EndDate datetime = '2015-03-31'
    declare @temp Table
    (
    DayDate datetime
    );
    
    WHILE @StartDate <= @EndDate
    begin
     INSERT INTO @temp (DayDate) VALUES (@StartDate);
     SET @StartDate = Dateadd(Day,1, @StartDate);
    end ;
    
    select * from @temp
    

    결과:

    DayDate
    -----------------------
    2015-03-01 00:00:00.000
    2015-03-02 00:00:00.000
    2015-03-03 00:00:00.000
    2015-03-04 00:00:00.000
    ...
    
  5. ==============================

    5.해결책:

    해결책:

    DECLARE  @StartDate DATETIME
            ,@EndDate DATETIME;
    
    SELECT   @StartDate = '20110105'
            ,@EndDate = '20110815';
    
    SELECT  DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(MONTH, v.number, @StartDate)), 0) AS FirstDay
    --or Andriy M suggestion:
    --SELECT    DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate) + v.number, 0) AS FirstDay
    INTO    #Results
    FROM    master.dbo.spt_values v
    WHERE   v.type = 'P'        
    AND     DATEDIFF(MONTH, @StartDate, @EndDate) >= v.number;
    
    SELECT  *
    FROM    #Results;
    
    DROP TABLE #Results;
    

    결과 :

    FirstDay
    -----------------------
    2011-01-01 00:00:00.000
    2011-02-01 00:00:00.000
    2011-03-01 00:00:00.000
    2011-04-01 00:00:00.000
    2011-05-01 00:00:00.000
    2011-06-01 00:00:00.000
    2011-07-01 00:00:00.000
    2011-08-01 00:00:00.000
    
  6. ==============================

    6.흥미롭게도,이 글에 따라 열거 된 데이터로부터 생성 빠릅니다.

    흥미롭게도,이 글에 따라 열거 된 데이터로부터 생성 빠릅니다.

    DECLARE @StartDate DATE = '10001201';
    DECLARE @EndDate DATE   = '20000101';
    
    DECLARE @dim TABLE ([date] DATE)
    
    INSERT @dim([date])
    SELECT d
    FROM
    (
      SELECT
          d = DATEADD(DAY, rn - 1, @StartDate)
      FROM 
      (
          SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate)) 
              rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
          FROM
              sys.all_objects AS s1
          CROSS JOIN
              sys.all_objects AS s2
          ORDER BY
              s1.[object_id]
      ) AS x
    ) AS y;
    

    내 컴퓨터에, 그것은 큰 날짜 범위에 약 60 % 더 빠르다. 내가 정말 증가 일 동안이 방법을 권장하지 않도록 재귀 방법은, 비록 약 3 초 만에 데이터 2000 년의 가치를 채우고 많이 좋네요 보이는 수 있습니다.

  7. ==============================

    7.널 날짜 수정 :

    널 날짜 수정 :

    IF OBJECT_ID('tempdb..#dim') IS NOT NULL 
    
        DROP TABLE #dim
    
    CREATE  TABLE #dim ([date] DATE)
    
    if not @Begin_Date is null and not @End_Date is null
    
    begin
        INSERT #dim([date])
        SELECT d
        FROM(
    
          SELECT
              d = DATEADD(DAY, rn - 1, @Begin_Date)
          FROM 
          (
              SELECT TOP (DATEDIFF(DAY, @Begin_Date, @End_Date)) 
                  rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
              FROM
                  sys.all_objects AS s1
              CROSS JOIN
                  sys.all_objects AS s2
              ORDER BY
                  s1.[object_id]
          ) AS x
        ) AS y;
    end
    
  8. ==============================

    8.

    CREATE TABLE #t (d DATE)
    
    INSERT INTO #t SELECT GETDATE()
    
    GO
    
    INSERT #t SELECT DATEADD(DAY, -1, MIN(d)) FROM #t
    
    GO 10
    
  9. from https://stackoverflow.com/questions/7812986/easiest-way-to-populate-a-temp-table-with-dates-between-and-including-2-date-par by cc-by-sa and MIT license