В моей таблице базы данных MySQL я следующие даты периоды (сезоны):Дата период распространилась среди сезонов
sstart,send,sname
2013-05-01,2013-05-31,'season1'
2013-06-01,2013-06-30,'season2'
Я хотел бы создать SQL запрос, который будет для данной даты начала и окончания раскола этот период среди сезоны с информацией о продолжительности каждой части периода:
Например, для следующего периода (QSTART, qend) 2013-04-20,2013-06-10 этот запрос должен возвращать:
2013-04-20,2013-04-30,'',11 <-- this is important - I need it
2013-05-01,2013-05-31,'season1',31 <-- 31 days of my period is in season1
2013-06-01,2013-06-10,'season2',10 <-- 10 days of my period is in season2
I иметь следующий SQL-запрос:
SELECT sid,sname,DATEDIFF(IF(send>@qend,@qend,send),IF(sstart<@qstart,@qstart,sstart))+1
FROM seasons WHERE sstart<[email protected] AND send>[email protected]
Моя проблема в том, когда мой период (QSTART, qend) до момента начала первого сезона или заканчивается после последнего сезона в базе данных, этот запрос не возвращает эти хвосты, которые мне нужны.
Спасибо за такой быстрый ответ. Я прочитал об этом решении с добавлением фиктивных строк (и объединил их), но думал, что это грязное решение. Если никто не предложит ничего лучшего, мне придется принять это как единственное решение. – sbrbot
Почему грязное решение? Конечно, вы могли бы добавить фиктивные строки в свою таблицу, если вы будете называть это много раз, но я полагаю, что таблица ваших сезонов очень мала, поэтому заявление о союзе, которое я проиллюстрировал, не займет много времени, чтобы запустить вообще. .. Вы также должны использовать UNION ALL вместо UNION, так как новые строки никогда не будут дублировать существующие строки ... – Sparky
Спасибо Sparky, ваше предложение было полезно. – sbrbot