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

1 ... 73 74 75 [ 76 ] 77 78 79 ... 219


end)

as days

from

select

max(case

when ename = BLAKE

then hiredate

end)

as blake hd,

max(case

when ename = JONES

then hiredate

end)

as ]ones hd

from

where

ename in

( BLAKE,JONES )

) x,

t500

where

t500.id <= blake hd-]ones hd+1

MySQL

Для формирования необходимого числа строк (дней) между двумя датами используйте сводную таблицу T500. Затем подсчитайте количество дней, не являющихся выходными. Добавление дней к каждой дате реализуйте с помощью функции DATE ADD. Воспользуйтесь функцией DATE FORMAT (формат даты) для получения названия дня недели для каждой даты:

10 11 12 13 14 15 16 17 18

select

from

select

sum(case when date format(

date add(]ones hd,

interval t500.id-1 DAY),%a) in ( Sat,Sun ) then 0 else 1

end) as days

max(case when ename = BLAKE then hiredate end) as blake hd, max(case when ename = JONES then hiredate as ]ones hd

from where

( BLAKE,JONES )

where

end)

ename in

) x,

t500

t500.id <= datediff(blake hd,]ones hd)+1

Oracle

Для формирования необходимого числа строк (дней) между двумя датами используйте сводную таблицу T500, и затем подсчитайте количество дней, не являющихся выходными. Используйте функцию TO CHAR для получения названия дня недели для каждой даты:

1 select sum(case when to char(]ones hd+t500.id-1,DY)

2 in ( SAT,SUN )

3 then 0 else 1



end)

as days

from

select

max(case

when ename = BLAKE

then hiredate

end)

as blake hd,

max(case

when ename = JONES

then hiredate

end)

as jones hd

from

where

ename in

( BLAKE,JONES )

) x,

t500

where

t500.id

= blake hd-jones hd+1

PostgreSQL

Для формирования необходимого числа строк (дней) между двумя датами используйте сводную таблицу T500. Затем подсчитайте количество дней, не являющихся выходными. Используйте функцию TO CHAR для получения названия дня недели для каждой даты:

select

sum(case

when trim(to char(jones hd+t500.id-1,DAY))

in ( SATURDAY,SUNDAY )

then 0 else 1

end)

as days

from

select max(case

when ename = BLAKE

then hiredate

end)

as blake hd,

max(case

when ename = JONES

then hiredate

end)

as jones hd

from

where

ename in

( BLAKE,JONES )

) x,

t500

where

t500.id <= blake hd-jones hd+1

SQL Server

Для формирования необходимого числа строк (дней) между двумя датами используйте сводную таблицу T500, и затем подсчитайте количество дней, не являющихся выходными. Используйте функцию DATENAME (имя даты) для получения названия дня недели для каждой даты:

1 select sum(case when datename(dw,jones hd+t500.id-1)

2 in ( SATURDAY,SUNDAY )

3 then 0 else 1

4 end) as days

5 from (

6 select max(case when ename = BLAKE

7 then hiredate

8 end) as blake hd,



max(case when ename = JONES

then hiredate

end) as ]ones hd

from

where

ename in ( BLAKE,JONES )

) x,

t500

where

t500.id <= datediff(day,]ones hd-blake hd)+1

Обсуждение

Хотя в различных СУБД используются разные встроенные функции для определения названия дня недели, общий подход к решению одинаков для всех СУБД. Решение можно разбить на два этапа:

1. Возвращаем дни между начальной и конечной датами (включая их).

2. Подсчитываем количество дней (т. е. строк), исключая выходные.

Вложенный запрос Х реализует первый этап. В нем можно заметить агрегатную функцию MAX, которая используется в рецепте для удаления значений NULL. Разобраться в работе функции MAX поможет следующий запрос. Он показывает результаты, возвращаемые вложенным запросом Х без функции MAX:

select case when ename = BLAKE then hiredate end as blake hd, case when ename = JONES

then hiredate end as jones hd from emp

where ename in ( BLAKE,JONES )

BLAKE HD JONES HD

02-APR-1981

01-MAY-1981

Без MAX возвращаются две строки. При использовании функции MAX будет возвращена только одна строка, а не две, причем без значений

NULL:

select max(case when ename = BLAKE then hiredate end) as blake hd, max(case when ename = JONES

then hiredate end) as jones hd from emp

where ename in ( BLAKE,JONES )

BLAKE HD JONES HD

01-MAY-1981 02-APR-1981



1 ... 73 74 75 [ 76 ] 77 78 79 ... 219

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