|
Программирование >> Преобразование значений null
29-JAN-2005 30-JAN-2005 31-JAN-2005 01-DEC-2005 02-DEC-2005 03-DEC-2005 29-DEC-2005 30-DEC-2005 31-DEC-2005 Последний шаг - посредством функции TO CHAR получить день недели для каждой даты и подсчитать количество каждого дня недели в году. Конечные результаты представлены ниже: select to char( cast( date trunc(year,current date) as date) + gs.id-1,DAY) as start dates, count(*) from generate series(1,366) gs(id) where gs.id <= (cast ( date trunc(year,current date) + interval 12 month as date) -cast(date trunc(year,current date) as date)) group by to char( cast( date trunc(year,current date) as date) + gs.id-1,DAY) Следующий шаг - обратиться к источнику строк (на самом деле, любому табличному выражению) с по крайней мере 366 строками. В качестве источника строк в данном решении используется функция GENERATE SERIES, но, безусловно, источником может быть и таблица T500. Затем добавляем по дню к первому дню года до тех пор, пока не будут возвращены все дни года (показано ниже): select cast( date trunc(year,current date) as date) + gs.id-1 as start date from generate series (1,366) gs(id) where gs.id <= (cast ( date trunc(year,current date) + interval 12 month as date) -cast(date trunc(year,current date) as date)) START DATE 01-JAN-2005 02-JAN-2005 03-JAN-2005
SQL Server Вложенный запрос TMP в рекурсивном представлении Х возвращает первый день текущего года: select cast( cast(year(getdate()) as varchar) + -01-01 as datetime) start date from t1 START DATE 01-JAN-2005 Получив первый день текущего года, добавляем один год к значению START DATE, чтобы иметь начальную и конечную даты. Необходимо знать обе даты, потому что мы хотим сгенерировать все дни года. START DATE и END DATE показаны ниже: select start date, dateadd(year,1,start date) end date from ( select cast( cast(year(getdate()) as varchar) + -01-01 as datetime) 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, dateadd(year,1,start date) end date from ( select cast( cast(year(getdate()) as varchar) + -01-01 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 Последний шаг - применяем к возвращенным рекурсивным представлением Х строкам функцию DATENAME и подсчитываем количество каждого дня недели в году. Окончательные результаты показаны ниже: with x(start date,end date) as ( select start date, dateadd(year,1,start date) end date from ( select cast( cast(year(getdate()) as varchar) + -01-01 as datetime) start date from t1 ) tmp union all select dateadd(day,1,start date), end date from x where dateadd(day,1,start date) < end date select datename(dw,start date), count(*) from x group by datename(dw,start date) OPTION (MAXRECURSION 366) as datetime) start date from t1 ) tmp union all select dateadd(day,1,start date), end date from x where dateadd(day,1,start date) < end date select * from x OPTION (MAXRECURSION 366) START DATE END DATE 01-JAN-2005 01-JAN-2006 02-JAN-2005 01-JAN-2006 03-JAN-2005 01-JAN-2006
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |