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

1 ... 79 80 81 [ 82 ] 83 84 85 ... 219


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



START DATE

COUNT(*)

FRIDAY

MONDAY

SATURDAY

SUNDAY

THURSDAY

TUESDAY

WEDNESDAY

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



1 ... 79 80 81 [ 82 ] 83 84 85 ... 219

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