генерируйте дни от диапазона дат

Если вам не нужно поддерживать IE7, то это отличный, сжатый взлом:

JSON.parse(JSON.stringify(new Date()))
133
задан Pentium10 29 January 2010 в 06:10
поделиться

5 ответов

Это решение использует без циклов, процедур или таблиц 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 с.

Кстати, это очень портативная техника, которая работает с большинством баз данных с незначительными корректировками.

Пример SQL Widdle возвращается на 1000 дней

309
ответ дан 23 November 2019 в 23:58
поделиться

Более универсальный ответ, который работает в 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
0
ответ дан 23 November 2019 в 23:58
поделиться

Хорошо .. попробуй это: 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

0
ответ дан 23 November 2019 в 23:58
поделиться

Раствор старого школы для этого без петли / курсора - создание таблицы таблицы , которая имеет один целочисленный столбец со значениями, начиная с 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

Вы бы его использовали для этого?


для генерации списков дат или цифр, чтобы оставить присоединиться к. Вы бы этому, чтобы увидеть, где в данных имеются пробелы, потому что вы оставляете присоединение к списку секвенциальных данных - нулевые значения будут иметь это очевидно, где существуют пробелы.

4
ответ дан 23 November 2019 в 23:58
поделиться

Если вам когда-нибудь понадобится больше пары дней, вам нужен стол.

Создайте диапазон дат в mysql

затем,

select from days.day, count(mytable.field) as fields from days left join mytable on day=date where date between x and y;
1
ответ дан 23 November 2019 в 23:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: