Get a list of dates between two dates

后端 未结 20 2124
醉梦人生
醉梦人生 2020-11-22 00:26

Using standard mysql functions is there a way to write a query that will return a list of days between two dates.

eg given 2009-01-01 and 2009-01-13 it would return

相关标签:
20条回答
  • 2020-11-22 00:56

    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'.

    0 讨论(0)
  • 2020-11-22 00:57

    I am using Server version: 5.7.11-log MySQL Community Server (GPL)

    Now we will solve this in a simple way.

    I have created a table named "datetable"

    mysql> describe datetable;
    +---------+---------+------+-----+---------+-------+
    | Field   | Type    | Null | Key | Default | Extra |
    +---------+---------+------+-----+---------+-------+
    | colid   | int(11) | NO   | PRI | NULL    |       |
    | coldate | date    | YES  |     | NULL    |       |
    +---------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

    now, wee will see the inserted records within.

    mysql> select * from datetable;
    +-------+------------+
    | colid | coldate    |
    +-------+------------+
    |   101 | 2015-01-01 |
    |   102 | 2015-05-01 |
    |   103 | 2016-01-01 |
    +-------+------------+
    3 rows in set (0.00 sec)
    

    and here our query to fetch records within two dates rather than those dates.

    mysql> select * from datetable where coldate > '2015-01-01' and coldate < '2016-01-01';
    +-------+------------+
    | colid | coldate    |
    +-------+------------+
    |   102 | 2015-05-01 |
    +-------+------------+
    1 row in set (0.00 sec)
    

    hope this would help many ones.

    0 讨论(0)
  • 2020-11-22 00:59

    Borrowing an idea from this answer, you can set up a table with 0 through 9 and use that to generate your list of dates.

    CREATE TABLE num (i int);
    INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
    
    select affffdate('2009-01-01', numlist.id) as `date` from
    (SELECT n1.i + n10.i*10 + n100.i*100 AS id
       FROM num n1 cross join num as n10 cross join num as n100) as numlist
    where affffdate('2009-01-01', numlist.id) <= '2009-01-13';
    

    This will allow you to generate a list of up to 1000 dates. If you need to go larger, you can add another cross join to the inner query.

    0 讨论(0)
  • 2020-11-22 00:59

    This solution is working with MySQL 5.0
    Create a table - mytable.
    The schema does not material. What matters is the number of rows in it.
    So, you can keep just one column of type INT with 10 rows, values - 1 to 10.

    SQL:

    set @tempDate=date('2011-07-01') - interval 1 day;
    select
    date(@tempDate := (date(@tempDate) + interval 1 day)) as theDate
    from mytable x,mytable y
    group by theDate
    having theDate <= '2011-07-31';
    

    Limitation: The maximum number of dates returned by above query will be
    (rows in mytable)*(rows in mytable) = 10*10 = 100.

    You can increase this range by changing form part in sql:
    from mytable x,mytable y, mytable z
    So, the range be 10*10*10 =1000 and so on.

    0 讨论(0)
  • 2020-11-22 01:01

    Create a stored procedure which takes two parameters a_begin and a_end. Create a temporary table within it called t, declare a variable d, assign a_begin to d, and run a WHILE loop INSERTing d into t and calling ADDDATE function to increment the value d. Finally SELECT * FROM t.

    0 讨论(0)
  • 2020-11-22 01:04

    For Access (or any SQL language)

    1. Create one table that has 2 fields, we'll call this table tempRunDates:
      --Fields fromDate and toDate
      --Then insert only 1 record, that has the start date and the end date.

    2. Create another table: Time_Day_Ref
      --Import a list of dates (make list in excel is easy) into this table.
      --The field name in my case is Greg_Dt, for Gregorian Date
      --I made my list from jan 1 2009 through jan 1 2020.

    3. Run the query:

      SELECT Time_Day_Ref.GREG_DT
      FROM tempRunDates, Time_Day_Ref
      WHERE Time_Day_Ref.greg_dt>=tempRunDates.fromDate And greg_dt<=tempRunDates.toDate;
      

    Easy!

    0 讨论(0)
提交回复
热议问题