Программирование >>  Преобразование значений null 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 219


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))



1 ... 77 78 79 [ 80 ] 81 82 83 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика