2017-02-10 152 views
0

我需要生成兩個日期之間的天這樣的SQL:生成日期範圍SQL天

generate days from date range

即時通訊使用此查詢:

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY 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 
) a 

效果很好,但是這總是產生1000天。我怎樣才能生成像365這樣的其他天數?

回答

0

你可以添加一個限制條款(和順序)

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY 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 
) a 
order by 1 desc 
limit 365 
0

或者,如果你被允許創建臨時表,在一個更可讀的方式 - 和可擴展到10,000以上的整數很容易:

CREATE TEMPORARY TABLE units(idx) 
ENGINE=MEMORY 
AS (
      SELECT 0 
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 
); 

SELECT a.the_date 
FROM (
SELECT curdate() - INTERVAL (hundreds + tens + units) DAY AS the_date 
FROM  (SELECT idx  AS units FROM units) units 
CROSS JOIN (SELECT idx* 10 AS tens  FROM units) tens 
CROSS JOIN (SELECT idx* 100 AS hundreds FROM units) hundreds 
WHERE hundreds + tens + units < 365 
) AS a 
ORDER BY 1 
;