|
Программирование >> Преобразование значений null
datepart(dw,dy) dw, case when datepart(dw,dy) = 1 then datepart(ww,dy)-1 else datepart(ww,dy) end wk from ( select dateadd(day,-day(getdate())+1,getdate()) dy from t1 ) x union all select dateadd(d,1,dy), day(dateadd(d,1,dy)), mth, datepart(dw,dateadd(d,1,dy)), case when datepart(dw,dateadd(d,1,dy)) = 1 then datepart(wk,dateadd(d,1,dy))-1 else datepart(wk,dateadd(d,1,dy)) end from x where datepart(m,dateadd(d,1,dy)) = mth select * from x
Теперь для каждого дня текущего месяца мы имеем: двузначный номер дня месяца, двузначный номер месяца, однозначный номер дня недели (1-7 для Вс.-Сб.) и двузначный ISO-номер недели. С помощью выражения CASE устанавливаем соответствие между каждым значением DM (каждым днем месяца) и днем недели, на который он выпадает. Результаты частично показаны ниже: with x(dy,dm,mth,dw,wk) as ( select dy, day(dy) dm, datepart(m,dy) mth, datepart(dw,dy) dw, case when datepart(dw,dy) = 1 then datepart(ww,dy)-1 else datepart(ww,dy) end wk from ( select dateadd(day,-day(getdate())+1,getdate()) dy from t1 ) x union all select dateadd(d,1,dy), day(dateadd(d,1,dy)), mth, datepart(dw,dateadd(d,1,dy)), case when datepart(dw,dateadd(d,1,dy)) = 1 then datepart(wk,dateadd(d,1,dy))-1 else datepart(wk,dateadd(d,1,dy)) end from x where datepart(m,dateadd(d,1,dy)) = mth
from x WK MO TU WE TH FR SA SU 22 01 22 02 22 03 22 04 22 05 23 0b 23 07 23 08 23 09 23 10 23 11 23 12 Каждый день возвращается в отдельной строке. В каждой строке номер дня месяца располагается в столбце, соответствующем дню недели, на который этот день выпадает. Теперь необходимо собрать все дни недели в одну строку. Для этого группируем строки по столбцу WK (ISO-номеру недели) и применяем функцию MAX к разным столбцам. В результате получаем формат календаря, такой как показан ниже: with x(dy,dm,mth,dw,wk) as ( select dy, day(dy) dm, datepart(m,dy) mth, datepart(dw,dy) dw, case when datepart(dw,dy) = 1 then datepart(ww,dy)-1 else datepart(ww,dy) end wk from ( select dateadd(day,-day(getdate())+1,getdate()) dy from t1 ) x union all select dateadd(d,1,dy), day(dateadd(d,1,dy)), mth, datepart(dw,dateadd(d,1,dy)), case when datepart(dw,dateadd(d,1,dy)) = 1 then datepart(wk,dateadd(d,1,dy))-1 else datepart(wk,dateadd(d,1,dy)) end from x where datepart(m,dateadd(d,1,dy)) = mth select max(case dw when 2 then dm end) as Mo, max(case dw when 3 then dm end) as Tu, max(case dw when 4 then dm end) as We, max(case dw when 5 then dm end) as Th, max(case dw when 6 then dm end) as Fr, max(case dw when 7 then dm end) as Sa, max(case dw when 1 then dm end) as Su from x group by wk order by wk Получение дат начала и конца кварталов года Задача Требуется возвратить даты начала и конца каждого из четырех кварталов данного года. Решение В году четыре квартала, таким образом, требуется создать четыре строки. После создания необходимого количества строк возвращаем даты начала и окончания кварталов с помощью функций для работы с датами, предоставляемых СУБД. Цель - сформировать следующее результирующее множество (текущий год выбирается произвольно): QTR Q START Q END
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |