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

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


select

days(ward hd) - days(allen hd)

from

select

hiredate as ward hd

from

where

ename = WARD

) x,

select

hiredate as allen hd

from

where

ename = ALLEN

Oracle и PostgreSQL

Используйте два вложенных запроса, чтобы найти значения HIRE-DATE для WARD и ALLEN, и затем вычтите одну дату из другой:

1 select ward hd - allen hd

2 from (

3 select hiredate as ward hd

В Oracle 9i Database ввведен тип TIMESTAMP (хранит и дату, и время). Для данных такого типа следует использовать решение с INTERVAL, приведенное для PostgreSQL. Кроме того, остерегайтесь передавать данные типа TIMESTAMP в старые функции работы с датами, такие как ADD MONTHS. При этом будет утеряна вся информация о дробных частях секунды, которая может храниться в значениях типа

TIMESTAMP.

Ключевое слово INTERVAL и сопровождающие его строковые литералы представляют соответствующий стандарту ISO синтаксис SQL. Стандарт требует, чтобы значения интервала были заключены в одинарные кавычки. PostgreSQL (а также Oracle 9i Database и более поздние версии) соблюдает стандарт. MySQL несколько отклоняется от него и не поддерживает кавычки.

Определение количества дней между двумя датами Задача

Требуется найти разность между двумя датами и представить результат в днях. Например, стоит задача вычислить разницу в днях между датами приема на работу (значения столбца HIREDATE) служащих ALLEN и WARD.

Решение DB2

Используйте два вложенных запроса, чтобы найти значения HIRE-DATE для WARD и ALLEN. Затем найдите разность этих значений с помощью функции DAYS (дни):



select

datediff(day,allen hd,ward hd)

from

select

hiredate as ward hd

from

where

ename = WARD

) x,

select

hiredate as allen hd

from

where

ename = ALLEN

Пользователи MySQL могут просто убрать первый аргумент функции DATEDIFF и поменять местами значения ALLEN nD и WARDHD.

Обсуждение

Во всех решениях вложенные запросы X и Y возвращают значения HI-REDATE для служащих WARD и ALLEN соответственно. Например:

select ward hd, allen hd from (

select hiredate as ward hd from emp

where ename = WARD

) y,

select hiredate as allen hd from emp where ename = ALLEN ) x

4 from emp

5 where ename = WARD

6 ) x,

8 select hiredate as allen hd

9 from emp

10 where ename = ALLEN

11 ) y

MySQL и SQL Server

Для определения количества дней между двумя датами используйте функцию DATEDIFF. В версии DATEDIFF для MySQL только два обязательных параметра (две даты, разницу между которыми необходимо найти), причем меньшая из двух дат должна быть передана в функцию первой (в SQL Server наоборот), чтобы избежать получения отрицательных значений. Версия этой функции для SQL Server позволяет задавать единицы измерения возвращаемого значения (в данном примере требуется получить разность в днях). В следующем решении используется SQL Server версия функции:




WARD HD ALLEN HD

22-FEB-1981 20-FEB-1981

Как видите, формируется декартово произведение, поскольку объединение X и Y не задано. В данном случае отсутствие объединения не создает никакой опасности, поскольку кардинальности X и Y равны 1, и, таким образом, результирующее множество будет иметь одну строку (это очевидно, потому что 1x1=1). Чтобы получить разность в днях, просто вычитаем одно из возвращенных значений из другого с помощью метода, подходящего для используемой базы данных.

Определение количества рабочих дней между двумя датами

Задача

Даны две даты, требуется найти, сколько рабочих дней между ними, включая эти даты. Например, если 10 января - вторник, а 11 января - среда, то между этими двумя датами два рабочих дня, поскольку оба дня являются обычными рабочими днями. В данном рецепте рабочими днями считаются все дни, кроме субботы и воскресенья.

Решение

В примерах решения определяется число рабочих дней между датами приема на работу (значениями столбца HIREDATE) служащих BLAKE и JONES. Для поиска, сколько рабочих дней выпадает между двумя датами, можно использовать сводную таблицу, каждая строка которой будет соответствовать каждому отдельному дню между двумя датами (включая их самих). После создания такой таблицы определение количества рабочих дней заключается в простом подсчете возвращенных дат, не являющихся субботой или воскресеньем.

Если необходимо исключить и праздничные дни, то можно создать таблицу HOLIDAYS (праздники), а затем включить в запрос простой предикат NOT IN для исключения из результата дней, перечисленых в таблице HOLIDAYS.

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

1 select sum(case when dayname(jones hd+t500.id day -1 day)

2 in ( Saturday,Sunday )

3 then 0 else 1



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

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