Если вам не нужно поддерживать IE7, то это отличный, сжатый взлом:
JSON.parse(JSON.stringify(new Date()))
Это решение использует без циклов, процедур или таблиц TEMP . Подзапрос генерирует даты в течение последних 10 000 дней, и может быть продлен, чтобы пойти как дальше назад или вперед, как вы хотите.
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'
Выход:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Примечания по производительности
Тестирование этого здесь , производительность удивительно хороша: Вышеуказанный запрос занимает 0,0009 с.
Если мы расширяем подзапрос для генерации ок. 100 000 номеров (и, таким образом, около 274 лет на сумму даты), он работает в 0,0458 с.
Кстати, это очень портативная техника, которая работает с большинством баз данных с незначительными корректировками.
Более универсальный ответ, который работает в MySQL AWS.
select datetable.Date
from (
select date_format(adddate(now(),-(a.a + (10 * b.a) + (100 * c.a))),'%Y-%m-%d') 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
) datetable
where datetable.Date between now() - INTERVAL 14 Day and Now()
order by datetable.Date DESC
Хорошо .. попробуй это:
http://www.devshed.com/c/a/mysql/delving-deeper-into-mysql-50/
http://dev.mysql.com/doc/refman/5.0/en/ Loop-emption.html
http://www.roseindia.net/sql/mysql-example/mysql-loop.shtml
Используйте это, скажем, генерируйте таблицу TEMP, а затем сделайте выбор * на Таблица Temp. Или выведите результаты по одному за раз.
Что вы говорите, вы хотите сделать, не могут быть сделаны с помощью оператора SELECT , но он может быть выполнен с вещами, специфическими для MySQL.
Потом опять же, может быть, вам нужны курсоры: http://dev.mysql.com/doc/refman/5.0/en/cursors.html
Раствор старого школы для этого без петли / курсора - создание таблицы
таблицы , которая имеет один целочисленный столбец со значениями, начиная с 1.
CREATE TABLE `example`.`numbers` (
`id` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Вам необходимо заполнить таблицу достаточно записями, чтобы охватить ваши потребности:
INSERT INTO NUMBERS (id) VALUES (NULL);
, как только у вас есть таблица
, вы можете использовать:
SELECT x.start_date + INTERVAL n.id-1 DAY
FROM NUMBERS n
JOIN (SELECT STR_TO_DATE('2010-01-20', '%Y-%m-%d') AS start_date
FROM DUAL) x
WHERE x.start_date + INTERVAL n.id-1 DAY <= '2010-01-24'
Абсолютное низкотехнологичное решение было бы:
SELECT STR_TO_DATE('2010-01-20', '%Y-%m-%d')
FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-21', '%Y-%m-%d')
FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-22', '%Y-%m-%d')
FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-23', '%Y-%m-%d')
FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-24', '%Y-%m-%d')
FROM DUAL
для генерации списков дат или цифр, чтобы оставить присоединиться к. Вы бы этому, чтобы увидеть, где в данных имеются пробелы, потому что вы оставляете присоединение к списку секвенциальных данных - нулевые значения будут иметь это очевидно, где существуют пробелы.
Если вам когда-нибудь понадобится больше пары дней, вам нужен стол.
затем,
select from days.day, count(mytable.field) as fields from days left join mytable on day=date where date between x and y;