Giải pháp này sử dụng không có vòng lặp, thủ tục hoặc bảng tạm thời . Truy vấn con tạo ra các ngày trong 10.000 ngày qua và có thể được mở rộng để lùi xa hoặc chuyển tiếp tùy ý bạn.
select a.Date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.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
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 d
) a
where a.Date between '2010-01-20' and '2010-01-24'
Đầu ra:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Ghi chú về hiệu suất
Thử nghiệm nó tại đây , hiệu suất tốt một cách đáng ngạc nhiên: truy vấn trên mất 0,0009 giây.
Nếu chúng ta mở rộng truy vấn con để tạo ra khoảng. 100.000 số (và như vậy có giá trị khoảng 274 năm), nó chạy trong 0,0458 giây.
Ngẫu nhiên, đây là một kỹ thuật rất linh hoạt, hoạt động với hầu hết các cơ sở dữ liệu với những điều chỉnh nhỏ.
Ví dụ SQL Fiddle trả lại 1.000 ngày