powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как вывести диапазон дат
19 сообщений из 19, страница 1 из 1
Как вывести диапазон дат
    #38530413
alberto djovali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте
Как вывести диапазон дат например за месяц. Можно ли это сделать Select`ом?
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38530431
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alberto djovaliЗдравствуйте
Как вывести диапазон дат например за месяц. Можно ли это сделать Select`ом?
а ты правильно понимаешь слово "диапазон" ?
диапазон - это 2-е даты : "С" и "По" - вывести "можно", наверняка и сам справишься
но тебе, скорее всего, нужно другое ...
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38530438
alberto djovali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Диапазон я имел ввиду список дат С и По. Без таблицы можно это сделать Select`ом?
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38530454
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alberto djovaliДиапазон я имел ввиду список дат С и По. Без таблицы можно это сделать Select`ом?
можно,
идея такая (это для МС СКЛ, - переписать для МуСКЛ можно без проблем, тут нет ничего специфического)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select dateadd(d, cast(cast(a.num as varchar)+cast(b.num as varchar) as int), '20140101') as dt
from

(select 0 as num 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) a,
(select 0 as num 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) b

where dateadd(d, cast(cast(a.num as varchar)+cast(b.num as varchar) as int), '20140101')<='20140131'
order by 1



но лучше, для таких случаев, иметь в БД таблицу чисел от 0 до 100...0
ещё не раз пригодится
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38530460
alberto djovali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как просто вывести диапазон чисел например? Select выдаёт одну строку, а как сделать чтобы выдал несколько?
Сейчас: Select 1+1
Результат: 2
Требуется: Select 1..5
Результат:
1
2
3
4
5
Я так понимаю синтаксис не допускает так сделать?
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38531349
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alberto djovaliЯ так понимаю синтаксис не допускает так сделать? Глаза вам на что даны? Внутренний юнион то самое вам и выведет.
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38531361
alberto djovali,

Как-то так...
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38552490
Alexey_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не мое, но может кому-то пригодится )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT '2014-01-01' + INTERVAL seq.num DAY `date`
  FROM (
    SELECT @n := 0 num
    UNION
    SELECT @n := @n + 1 num
    FROM big_table
  ) seq
  WHERE seq.num BETWEEN 0 AND DATEDIFF(/*end_date*/'2019-12-31', /*begin_date*/'2014-01-01');



где big_table - большая таблица
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38552771
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc, работать-то оно работает, но алгоритм!
1)фулскан большой таблицы
2)материализация результата (особенно замечательно, если исходная таблица - с блобами, да побольше)
3)фильтрация результата
Это же facepalm, возможно даже двойной!
Да и условие фильтрации убоищное.
Короче, вердикт - сжечь и закопать поглубже.
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38552772
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ах да, чуть не забыл, там ещё и юнион вместо юнион алл = дополнительные расходы на проверку уникальности, при том что она и так самим построением гарантирована.
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38552970
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcничего из вышестояшего не оправдывает
Кто-то считает так, кто-то иначе.

Моё мнение таково - это "решение" может увидеть и, не сильно разобравшись, применить кто-то, кто придёт с аналогичной проблемой позже. И поимеет на том кучу геморроя. Причины озвучены выше. А мы соответственно будем выглядеть сборищем индусов. Это первое.
Второе - возможет вариант, что big_table в некие технологические моменты будет truncated или вообще удалена/переименована, итог в обоих случаях вполне предсказуем - и печален.

Каждый аргумент уже сам по себе является достаточным основанием для отнесения этого "решения" к категории БСК. Вместе - тем более.

Самым логичным и правильным решением я считаю решение qwerty112 - с той лишь модификацией, что достаточно оставить генерацию чисел от 0 до 5, вполне будет достаточно, и заменить конкатенацию и все CAST вычислением a+b*6.

Кстати, его второй, неявный, совет - относительно помещения в (служебную) БД таблицы numbers (я, правда, предпочитаю таблицу digits - от 0 до 9),- сам по себе весьма полезен.
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553402
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Поддержу. Когда-то, года три назад, начинал осваивать Мускуль и столкнулся с таким же или похожим вопросом. Каково было мое удивление, что тут надо делать union из чиселок чтобы сгенерить последовательность... сделал табличку 0..9 и тоже `digits`. И теперь она за мной так и кочует уже из одного проекта в другой. Очень полезная табличка. :)
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553453
Alexey_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен со всеми постами, написанными после моего.

Не оправдание, но все же:
Пример взял здесь:
http://forum.shelek.ru/index.php/topic,25277.msg242175.html
Нужно было вывести диапазон дат за некий (небольшой период).
Мое условие в отборе: диапазон дат за 5 лет, начиная с 01.01.2014.
big_table - таблица с 1-м полем и 3К записей.
Результат 0,05 сек. Так как я посчитал его приемлемым, "запостил" селект для размышления топикстартеру.
Теперь он (да и я) знает, что так делать не следует.

Вариант с внутренним UNION ALL или табличкой digits мне самому больше нравится, но, если честно, к моменту написания того поста - у меня не получалось его реализовать, поэтому запостил что было.
Спасибо за конструктивную критику!
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553488
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MS SQL такая табличка устанавливается при инсталляции сервера:) master.dbo.spt_values
Доступна на чтение для всех пользователей, содержит много чего, в т.ч. числа от 0 до 2047
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553501
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
доступна даже на http://sqlfiddle.com/#!6/d41d8/14646
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553874
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Попрошу сильно не распаляться, ближе к вечеру/завтра излишние эмоции почищу.
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553933
Alexey_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю, появится ли топикстартер.
С MySql я не работаю, просто вопрос показался интересным, вот и решил "помочь чем смогу" )

Запрос qwerty112 для MySql переписал так:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT '2014-01-01' + INTERVAL(CAST(CONCAT(CAST(a.num AS CHAR), CAST(b.num AS CHAR)) AS UNSIGNED)) DAY `date`
 FROM
(SELECT 0 AS num 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,
(SELECT 0 AS num 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
WHERE '2014-01-01' + INTERVAL(CAST(CONCAT(CAST(a.num AS CHAR), CAST(b.num AS CHAR)) AS UNSIGNED)) DAY <= '2014-04-01'
ORDER BY 1



Тут ми имеем ограничение в 99 дней, про что qwerty112 писал
qwerty112но лучше, для таких случаев, иметь в БД таблицу чисел от 0 до 100...0
ещё не раз пригодится

Со слов Akina:
Akinaдостаточно оставить генерацию чисел от 0 до 5, вполне будет достаточно, и заменить конкатенацию и все CAST вычислением a+b*6
Если не сложно, помогите, пожалуйста, добить для MySql пример в части "a+b*6".

Возможно еще кому то на sql.ru пригодится :)
...
Рейтинг: 0 / 0
Как вывести диапазон дат
    #38553996
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну поскольку у тебя ТРИ месяца - придётся оставить UNION-ы от 0 до 9. Просто в двух местах замени
Код: sql
1.
INTERVAL(CAST(CONCAT(CAST(a.num AS CHAR), CAST(b.num AS CHAR)) AS UNSIGNED)) DAY


на
Код: sql
1.
INTERVAL (10 * a + b) DAY
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как вывести диапазон дат
    #39335480
asmodeusta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey_UA,

Код: sql
1.
2.
3.
4.
5.
6.
SELECT '2014-02-01' + INTERVAL (6 * a.num + b.num) DAY `date`
 FROM
(SELECT 0 AS num UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) AS a,
(SELECT 0 AS num UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) AS b
WHERE '2014-02-01' + INTERVAL (6 * a.num + b.num) DAY <= '2014-03-01'
ORDER BY 1
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как вывести диапазон дат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]