Generate a range of dates using SQL

前端 未结 15 1302
面向向阳花
面向向阳花 2020-11-28 05:47

I have a SQL query that takes a date parameter (if I were to throw it into a function) and I need to run it on every day of the last year.

How to generate a list of

相关标签:
15条回答
  • 2020-11-28 06:13

    A week from 6 months back

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

    if you omit ROWNUM you get 50 rows only, independent of the value.

    0 讨论(0)
  • 2020-11-28 06:15

    For the fun of it, here's some code that should work in SQL Server, Oracle, or 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
    

    Bonus points if you can give me a cross-platform syntax to re-use the digits table.

    0 讨论(0)
  • 2020-11-28 06:16

    Date range between 12/31/1996 and 12/31/2020

    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')
      )
    
    0 讨论(0)
提交回复
热议问题