|
Программирование >> Преобразование значений null
9 from t1 10 ) tmp 11 union all 12 select dateadd(day,1,start date), end date 13 from x 14 where dateadd(day,1,start date) < end date 15 ) 16 select datename(dw,start date),count(*) 17 from x 18 group by datename(dw,start date) 19 OPTION (MAXRECURSION 366) Обсуждение DB2 Вложенный запрос TMP в рекурсивном представлении X возвращает первый день текущего года, как показано ниже: select (current date - dayofyear(current date) day) +1 day as start date from t1 START DATE 01-JAN-2005 Следующий шаг - добавить один год к значению START DATE (начальная дата), чтобы иметь в своем распоряжении начальную и конечную даты. Необходимо знать обе граничные даты, потому что мы будем генерировать каждый день года. START DATE и END DATE (конечная дата) показаны ниже: select start date, start date + 1 year end date from ( select (current date - dayofyear(current date) day) +1 day as start date from t1 ) tmp START DATE END DATE 01-JAN-2005 01-JAN-2006 Далее рекурсивно добавляем к START DATE по одному дню до тех пор, пока не получим значение, равное END DATE. Ниже показаны некоторые строки, возвращенные рекурсивным представлением Х: with x (start date,end date) as ( select start date, start date + 1 year end date 29-JAN-2005 01-JAN-2006 30-JAN-2005 01-JAN-2006 31-JAN-2005 01-JAN-2006 01-DEC-2005 01-JAN-2006 02-DEC-2005 01-JAN-2006 03-DEC-2005 01-JAN-2006 29-DEC-2005 01-JAN-2006 30-DEC-2005 01-JAN-2006 31-DEC-2005 01-JAN-2006 Последний шаг - применить к строкам, возвращенным рекурсивным представлением Х, функцию DAYNAME и подсчитать количество дней с каждым именем. Окончательный результат приведен ниже: with x (start date,end date) as ( select start date, start date + 1 year end date from ( select (current date - dayofyear(current date) day) +1 day as start date from t1 ) tmp union all select start date + 1 day, end date from x where start date + 1 day < end date select dayname(start date),count(*) from x group by dayname(start date) from ( select (current date - dayofyear(current date) day) +1 day as start date from t1 ) tmp union all select start date + 1 day, end date from x where start date + 1 day < end date select * from x START DATE END DATE 01-JAN-2005 01-JAN-2006 02-JAN-2005 01-JAN-2006 03-JAN-2005 01-JAN-2006 START DATE COUNT(*) FRIDAY 52 MONDAY 52 SATURDAY 53 SUNDAY 52 THURSDAY 52 TUESDAY 52 WEDNESDAY 52 MySQL В данном решении делаем запрос к таблице T500, чтобы получить количество строк, соответствующее числу дней в году. Команда в строке 4 возвращает первый день текущего года. Она извлекает год из даты, возвращенной функцией CURRENT DATE (текущая дата), и добавляет к нему месяц и год (следуя стандартному формату дат MySQL). Результат показан ниже: select concat(year(current date),-01-01) from t1 START DATE 01-JAN-2005 Теперь, имея первый день текущего года, с помощью функции DATE-ADD добавляем к нему значения столбца T500.ID, чтобы получить каждый день года. Применяя функцию DATE FORMAT, возвращаем для каждой даты соответствующий день недели. Чтобы выбрать необходимое число строк из таблицы T500, находим разницу в днях между первым днем текущего года и первым днем следующего года и возвращаем такое же количество строк (их будет 365 или 366). Результаты частично показаны ниже: select date format( date add( cast( concat(year(current date),-01-01) as date), interval t500.id-1 day), %W) day from t500 where t500.id <= datediff( cast( concat(year(current date)+1,-01-01) as date), cast( concat(year(current date),-01-01) as date))
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |