generate days from date range

后端 未结 29 2478
渐次进展
渐次进展 2020-11-21 05:19

I would like to run a query like

select ... as days where `date` is between \'2010-01-20\' and \'2010-01-24\'

And return data like:

相关标签:
29条回答
  • 2020-11-21 06:06

    Elegant solution using new recursive (Common Table Expressions) functionality in MariaDB >= 10.3 and MySQL >= 8.0.

    WITH RECURSIVE t as (
        select '2019-01-01' as dt
      UNION
        SELECT DATE_ADD(t.dt, INTERVAL 1 DAY) FROM t WHERE DATE_ADD(t.dt, INTERVAL 1 DAY) <= '2019-04-30'
    )
    select * FROM t;
    

    The above returns a table of dates between '2019-01-01' and '2019-04-30'. It is also decently fast. Returning 1000 years worth of dates (~365,000 days) takes about 400ms on my machine.

    0 讨论(0)
  • 2020-11-21 06:09

    SQLite version of RedFilters top solution

    select d.Date
    from (
        select 
        date(julianday('2010-01-20') + (a.a + (10 * b.a) + (100 * c.a))) as Date
        from (select 0 as a 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) as a
        cross join (select 0 as a 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) as b
        cross join (select 0 as a 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) as c
    ) d
    where 
    d.Date between '2010-01-20' and '2010-01-24' 
    order by d.Date
    
    0 讨论(0)
  • 2020-11-21 06:10

    Here is another variation using views:

    CREATE VIEW digits AS
      SELECT 0 AS digit 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;
    
    CREATE VIEW numbers AS
      SELECT
        ones.digit + tens.digit * 10 + hundreds.digit * 100 + thousands.digit * 1000 AS number
      FROM
        digits as ones,
        digits as tens,
        digits as hundreds,
        digits as thousands;
    
    CREATE VIEW dates AS
      SELECT
        SUBDATE(CURRENT_DATE(), number) AS date
      FROM
        numbers;
    

    And then you can simply do (see how elegant it is?):

    SELECT
      date
    FROM
      dates
    WHERE
      date BETWEEN '2010-01-20' AND '2010-01-24'
    ORDER BY
      date
    

    Update

    It is worth noting that you will only be able to generate past dates starting from the current date. If you want to generate any kind of dates range (past, future, and in between), you will have to use this view instead:

    CREATE VIEW dates AS
      SELECT
        SUBDATE(CURRENT_DATE(), number) AS date
      FROM
        numbers
      UNION ALL
      SELECT
        ADDDATE(CURRENT_DATE(), number + 1) AS date
      FROM
        numbers;
    
    0 讨论(0)
  • 2020-11-21 06:10

    Alright.. Try this: http://www.devshed.com/c/a/MySQL/Delving-Deeper-into-MySQL-50/
    http://dev.mysql.com/doc/refman/5.0/en/loop-statement.html
    http://www.roseindia.net/sql/mysql-example/mysql-loop.shtml

    Use that to, say, generate a temp table, and then do a select * on the temp table. Or output the results one at a time.
    What you say you want to do can't be done with a SELECT statement, but it might be doable with things specific to MySQL.
    Then again, maybe you need cursors: http://dev.mysql.com/doc/refman/5.0/en/cursors.html

    0 讨论(0)
  • 2020-11-21 06:10

    if you want the list of dates between two dates:

    create table #dates ([date] smalldatetime)
    while @since < @to
    begin
         insert into #dates(dateadd(day,1,@since))
         set @since = dateadd(day,1,@since)
    end
    select [date] from #dates
    

    *fiddle here: http://sqlfiddle.com/#!6/9eecb/3469

    0 讨论(0)
  • 2020-11-21 06:10

    improved with weekday an joining a custom holiday table microsoft MSSQL 2012 for powerpivot date table https://gist.github.com/josy1024/cb1487d66d9e0ccbd420bc4a23b6e90e

    with [dates] as (
        select convert(datetime, '2016-01-01') as [date] --start
        union all
        select dateadd(day, 1, [date])
        from [dates]
        where [date] < '2018-01-01' --end
    )
    select [date]
    , DATEPART (dw,[date]) as Wochentag
    , (select holidayname from holidaytable 
    where holidaytable.hdate = [date]) 
    as Feiertag
    from [dates]
    where [date] between '2016-01-01' and '2016-31-12'
    option (maxrecursion 0)
    
    0 讨论(0)
提交回复
热议问题