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

1 ... 98 99 100 [ 101 ] 102 103 104 ... 219


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

01-JUN-2005

02-JUN-2005

21-JUN-2005

22-JUN-2005

30-JUN-2005

Теперь для каждого дня текущего месяца мы имеем: двузначный номер дня месяца, двузначный номер месяца, однозначный номер дня недели (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

select case

when

then

case

when

then

case

when

then

case

when

then

case

when

then

case

when

then

case

when

then

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



1 ... 98 99 100 [ 101 ] 102 103 104 ... 219

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