|
Программирование >> Преобразование значений null
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 (дни):
Пользователи 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |