복붙노트

[SQL] SQL을 사용하여 날짜 범위를 생성

SQL

SQL을 사용하여 날짜 범위를 생성

(I 함수에 던져한다면) 나는 날짜 매개 변수를 SQL 쿼리를하고 난 작년의 모든 일에서 실행해야합니다.

나는이 작업을 수행하는 SQL 직선까지 사용할 수 있도록하는 방법, 마지막 365일의 목록을 생성하는?

물론 이후로 난 항상 할 수도 0..364이 작동 할 목록을 생성 :

SELECT SYSDATE - val FROM (...);

해결법

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

    1.초대형 테이블이나 ALL_OBJECTS 테이블을 사용할 필요가 없습니다 :

    초대형 테이블이나 ALL_OBJECTS 테이블을 사용할 필요가 없습니다 :

    SELECT TRUNC (SYSDATE - ROWNUM) dt
      FROM DUAL CONNECT BY ROWNUM < 366
    

    트릭을 할 것입니다.

  2. ==============================

    2.

     SELECT (sysdate-365 + (LEVEL -1)) AS DATES
     FROM DUAL connect by level <=( sysdate-(sysdate-365))
    

    날짜 '에'행 '및 경우 SYSDATE 및 SYSDATE-365 대신에 대체되어, 출력에서 ​​날짜의 날짜 사이의 범위 일 것이다.

  3. ==============================

    3.최근에 나는 비슷한 문제를 가지고이 쉽게 쿼리를 해결 :

    최근에 나는 비슷한 문제를 가지고이 쉽게 쿼리를 해결 :

    SELECT
      (to_date(:p_to_date,'DD-MM-YYYY') - level + 1) AS day
    FROM
      dual
    CONNECT BY LEVEL <= (to_date(:p_to_date,'DD-MM-YYYY') - to_date(:p_from_date,'DD-MM-YYYY') + 1);
    

    SELECT
      (to_date('01-05-2015','DD-MM-YYYY') - level + 1) AS day
    FROM
      dual
    CONNECT BY LEVEL <= (to_date('01-05-2015','DD-MM-YYYY') - to_date('01-04-2015','DD-MM-YYYY') + 1);
    

    결과

    01-05-2015 00:00:00
    30-04-2015 00:00:00
    29-04-2015 00:00:00
    28-04-2015 00:00:00
    27-04-2015 00:00:00
    26-04-2015 00:00:00
    25-04-2015 00:00:00
    24-04-2015 00:00:00
    23-04-2015 00:00:00
    22-04-2015 00:00:00
    21-04-2015 00:00:00
    20-04-2015 00:00:00
    19-04-2015 00:00:00
    18-04-2015 00:00:00
    17-04-2015 00:00:00
    16-04-2015 00:00:00
    15-04-2015 00:00:00
    14-04-2015 00:00:00
    13-04-2015 00:00:00
    12-04-2015 00:00:00
    11-04-2015 00:00:00
    10-04-2015 00:00:00
    09-04-2015 00:00:00
    08-04-2015 00:00:00
    07-04-2015 00:00:00
    06-04-2015 00:00:00
    05-04-2015 00:00:00
    04-04-2015 00:00:00
    03-04-2015 00:00:00
    02-04-2015 00:00:00
    01-04-2015 00:00:00
    
  4. ==============================

    4.오라클 특정하고, 기존의 대형 테이블 또는 데이터 사전 객체를 통해 복잡한 시스템 뷰에 의존하지 않습니다.

    오라클 특정하고, 기존의 대형 테이블 또는 데이터 사전 객체를 통해 복잡한 시스템 뷰에 의존하지 않습니다.

    SELECT c1 from dual
      MODEL DIMENSION BY (1 as rn)  MEASURES (sysdate as c1)
      RULES ITERATE (365) 
      (c1[ITERATION_NUMBER]=SYSDATE-ITERATION_NUMBER)
    order by 1
    
  5. ==============================

    5.꽤 자주 오라클에서 사용하는 방법은 다음과 같이이다 :

    꽤 자주 오라클에서 사용하는 방법은 다음과 같이이다 :

    select trunc(sysdate)-rn
    from
    (   select rownum rn
        from   dual
        connect by level <= 365)
    /
    

    응용 프로그램이 날짜 목록에 대한 필요가있는 경우 개인적으로, 나는 단지 그들과 함께 테이블을 만들거나 이런 종류의 물건에 사용될 수 백만 같은 말도 안되는 일까지 정수의 일련의 테이블을 만들 것입니다.

  6. ==============================

    6.일년 너무 늦게 반 정도,하지만 여기에 후대를 위해 테라 데이타를위한 버전입니다 :

    일년 너무 늦게 반 정도,하지만 여기에 후대를 위해 테라 데이타를위한 버전입니다 :

    SELECT calendar_date 
    FROM SYS_CALENDAR.Calendar
    WHERE SYS_CALENDAR.Calendar.calendar_date between '2010-01-01' (date) and '2010-01-03' (date)
    
  7. ==============================

    7.1996년 12월 31일와 2020-12-31 사이의 날짜 범위

    1996년 12월 31일와 2020-12-31 사이의 날짜 범위

    SELECT dt, to_char(dt, 'MM/DD/YYYY') as date_name, 
      EXTRACT(year from dt) as year, 
      EXTRACT(year from fiscal_dt) as fiscal_year,
      initcap(to_char(dt, 'MON')) as month,
      to_char(dt, 'YYYY')        || ' ' || initcap(to_char(dt, 'MON')) as year_month,
      to_char(fiscal_dt, 'YYYY') || ' ' || initcap(to_char(dt, 'MON')) as fiscal_year_month,
      EXTRACT(year from dt)*100        + EXTRACT(month from dt) as year_month_id,
      EXTRACT(year from fiscal_dt)*100 + EXTRACT(month from fiscal_dt) as fiscal_year_month_id,
      to_char(dt, 'YYYY')        || ' Q' || to_char(dt, 'Q') as quarter,
      to_char(fiscal_dt, 'YYYY') || ' Q' || to_char(fiscal_dt, 'Q') as fiscal_quarter
      --, EXTRACT(day from dt) as day_of_month, to_char(dt, 'YYYY-WW') as week_of_year, to_char(dt, 'D') as day_of_week
      FROM (
        SELECT dt, add_months(dt, 6) as fiscal_dt --starts July 1st
        FROM (
          SELECT TO_DATE('12/31/1996', 'mm/dd/yyyy') + ROWNUM as dt 
          FROM DUAL CONNECT BY ROWNUM < 366 * 30 --30 years
        )
        WHERE dt <= TO_DATE('12/31/2020', 'mm/dd/yyyy')
      )
    
  8. ==============================

    8.Ahahaha, 여기 그냥 이렇게하는 내놓았다 재미있는 방법이있다 :

    Ahahaha, 여기 그냥 이렇게하는 내놓았다 재미있는 방법이있다 :

    select SYSDATE - ROWNUM
    from shipment_weights sw
    where ROWNUM < 365;
    

    여기서 shipment_weights 어떤 큰 테이블이고;

  9. ==============================

    9.나도 같은 요구를했다 - 난 그냥 사용합니다. 사용자는 그 / 그녀의 일정 범위를 제한하고자하는 일 수를 입력합니다.

    나도 같은 요구를했다 - 난 그냥 사용합니다. 사용자는 그 / 그녀의 일정 범위를 제한하고자하는 일 수를 입력합니다.

      SELECT DAY, offset
        FROM (SELECT to_char(SYSDATE, 'DD-MON-YYYY') AS DAY, 0 AS offset
                FROM DUAL
              UNION ALL
              SELECT to_char(SYSDATE - rownum, 'DD-MON-YYYY'), rownum
                FROM all_objects d)
                where offset <= &No_of_days
    

    I는 LEFT OUTER에서보기 날짜가 테이블에 관련된 다른 전망 JOIN 구동으로 상기 결과 집합을 사용한다.

  10. ==============================

    10.6개월 뒤쪽에서 주

    6개월 뒤쪽에서 주

    SELECT (date'2015-08-03' + (LEVEL-1)) AS DATES
     FROM DUAL 
     where ROWNUM < 8
     connect by level <= (sysdate-date'2015-08-03'); 
    

    당신이 ROWNUM을 생략하는 경우는 값의 독립적 인 50 개 행을 얻을.

  11. ==============================

    11.그것의 재미를 위해, 여기에 SQL 서버, 오라클, 또는 MySQL의에서 작동해야 할 몇 가지 코드는 :

    그것의 재미를 위해, 여기에 SQL 서버, 오라클, 또는 MySQL의에서 작동해야 할 몇 가지 코드는 :

    SELECT current_timestamp - CAST(d1.digit + d2.digit + d3.digit as int)
    FROM 
    (
        SELECT digit
        FROM
        (
            select '1' as digit
            union select '2'
            union select '3'
            union select '4'
            union select '5'
            union select '6'
            union select '7'
            union select '8'
            union select '9'
            union select '0'
        ) digits
    ) d1
    CROSS JOIN
    (
        SELECT digit
        FROM
        (
            select '1' as digit
            union select '2'
            union select '3'
            union select '4'
            union select '5'
            union select '6'
            union select '7'
            union select '8'
            union select '9'
            union select '0'
        ) digits
    ) d2
    CROSS JOIN
    (
        SELECT digit
        FROM
        (
            select '1' as digit
            union select '2'
            union select '3'
            union select '4'
            union select '5'
            union select '6'
            union select '7'
            union select '8'
            union select '9'
            union select '0'
        ) digits
    ) d3
    WHERE CAST(d1.digit + d2.digit + d3.digit as int) < 365
    ORDER BY d1.digit, d2.digit, d3.digit -- order not really needed here
    

    당신이 나에게로 크로스 플랫폼 구문 줄 수있는 경우 보너스 포인트는 숫자 테이블을 재-사용합니다.

  12. ==============================

    12.안하는 것보다 늦게하는 것이 낫다. (A) 일 오늘을 통해 현재 월의 1, PLUS (b)는 최근 2 개월간의 모든 날짜 : 여기에 포함 날짜 목록을 반환 내가 (이 기사를 읽은 후) 고안하는 방법이다 :

    안하는 것보다 늦게하는 것이 낫다. (A) 일 오늘을 통해 현재 월의 1, PLUS (b)는 최근 2 개월간의 모든 날짜 : 여기에 포함 날짜 목록을 반환 내가 (이 기사를 읽은 후) 고안하는 방법이다 :

    select (sysdate +1 - rownum) dt 
    from dual 
     connect by rownum <= (sysdate - add_months(sysdate - extract(day from sysdate),-2));
    

    은 "-2"를 포함하는 날짜의 사전 개월간의 수입니다. 즉이 전체 이전 달 플러스는 현재 부분적 월 - 예를 들어, 7 월 10 일,이 SQL 7 월 10까지 5 월 1 일부터 모든 날짜의 목록을 반환합니다.

  13. ==============================

    13.나는 숫자 테이블을 다시 사용에 대한 답을 가지고 있지 않지만 여기에 SQL 서버 적어도 일을하고 조금 빠른 것 코드 샘플입니다.

    나는 숫자 테이블을 다시 사용에 대한 답을 가지고 있지 않지만 여기에 SQL 서버 적어도 일을하고 조금 빠른 것 코드 샘플입니다.

    print("code sample");
    
    select  top 366 current_timestamp - row_number() over( order by l.A * r.A) as DateValue
    from (
    select  1 as A union
    select  2 union
    select  3 union
    select  4 union
    select  5 union
    select  6 union
    select  7 union
    select  8 union
    select  9 union
    select  10 union
    select  11 union
    select  12 union
    select  13 union
    select  14 union
    select  15 union
    select  16 union
    select  17 union
    select  18 union
    select  19 union
    select  20 union
    select  21 
    ) l
    cross join (
    select 1 as A union
    select 2 union
    select 3 union
    select 4 union
    select 5 union
    select 6 union
    select 7 union
    select 8 union
    select 9 union
    select 10 union
    select 11 union
    select 12 union
    select 13 union
    select 14 union
    select 15 union
    select 16 union
    select 17 union
    select 18
    ) r
    print("code sample");
    
  14. ==============================

    14.이 쿼리는 (http://blogs.x2line.com/al/articles/207.aspx에 영감) 날짜 4천일 오늘 같은 과거에 미래 5000의 목록을 생성합니다 :

    이 쿼리는 (http://blogs.x2line.com/al/articles/207.aspx에 영감) 날짜 4천일 오늘 같은 과거에 미래 5000의 목록을 생성합니다 :

    SELECT * FROM (SELECT
        (CONVERT(SMALLDATETIME, CONVERT(CHAR,GETDATE() ,103)) + 4000 -
                    n4.num * 1000 -
                    n3.num * 100 -
                    n2.num * 10 -
                    n1.num) AS Date, 
        year(CONVERT(SMALLDATETIME, CONVERT(CHAR,GETDATE() ,103)) + 4000 -
                    n4.num * 1000 -
                    n3.num * 100 -
                    n2.num * 10 -
                    n1.num) as Year,
        month(CONVERT(SMALLDATETIME, CONVERT(CHAR,GETDATE() ,103)) + 4000 -
                    n4.num * 1000 -
                    n3.num * 100 -
                    n2.num * 10 -
                    n1.num) as Month,
        day(CONVERT(SMALLDATETIME, CONVERT(CHAR,GETDATE() ,103)) + 4000 -
                    n4.num * 1000 -
                    n3.num * 100 -
                    n2.num * 10 -
                    n1.num) as Day
               FROM (SELECT 0 AS num union ALL
                     SELECT 1 UNION ALL
                     SELECT 2 UNION ALL
                     SELECT 3 UNION ALL
                     SELECT 4 UNION ALL
                     SELECT 5 UNION ALL
                     SELECT 6 UNION ALL
                     SELECT 7 UNION ALL
                     SELECT 8 UNION ALL
                     SELECT 9) n1
                   ,(SELECT 0 AS num UNION ALL
                     SELECT 1 UNION ALL
                     SELECT 2 UNION ALL
                     SELECT 3 UNION ALL
                     SELECT 4 UNION ALL
                     SELECT 5 UNION ALL
                     SELECT 6 UNION ALL
                     SELECT 7 UNION ALL
                     SELECT 8 UNION ALL
                     SELECT 9) n2
                   ,(SELECT 0 AS num union ALL
                     SELECT 1 UNION ALL
                     SELECT 2 UNION ALL
                     SELECT 3 UNION ALL
                     SELECT 4 UNION ALL
                     SELECT 5 UNION ALL
                     SELECT 6 UNION ALL
                     SELECT 7 UNION ALL
                     SELECT 8 UNION ALL
                     SELECT 9) n3  
                   ,(SELECT 0 AS num UNION ALL
                     SELECT 1 UNION ALL
                     SELECT 2 UNION ALL
                     SELECT 3 UNION ALL
                     SELECT 4 UNION ALL
                     SELECT 5 UNION ALL
                     SELECT 6 UNION ALL
                     SELECT 7 UNION ALL
                     SELECT 8) n4
            ) GenCalendar  ORDER BY 1
    
  15. from https://stackoverflow.com/questions/418318/generate-a-range-of-dates-using-sql by cc-by-sa and MIT license