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

1 ... 75 76 77 [ 78 ] 79 80 81 ... 219


В SQL Server для вычисления разницы в годах можно также использовать функцию DATEDIFF с указанием типа периода YEAR. Но такое решение приведет к получению значения 3, поскольку округление происходит вверх. - Примеч. науч.ред.

Обсуждение

DB2, MySQL и PostgreSQL

После того как в решении PostgreSQL из значений MIN HD и MAX HD извлечены соответствующие им годы и месяцы, методика определения количества месяцев и лет между датами MIN HD и MAX HD для этих трех СУБД одинакова. Данное обсуждение охватывает все три решения. Вложенный запрос Х возвращает граничные значения столбца

HIREDATE таблицы EMP:

select min(hiredate) as min hd, max(hiredate) as max hd from emp

MIN HD MAX HD

17-DEC-1980 12-JAN-1983

Чтобы найти количество месяцев, прошедшее между датами в столбцах MAX HD и MIN HD, умножаем разницу между этими двумя датами в годах на 12 и добавляем разницу между ними в месяцах. Если не совсем понятно, как это работает, разложим каждую дату на составляющие. Числовые значения лет и месяцев показаны ниже:

select year(max hd) as max yr, year(min hd) as min yr,

month(max hd) as max mon, month(min hd) as min mon from (

select min(hiredate) as min hd, max(hiredate) as max hd from emp ) x

MAX YR MIN YR MAX MON MIN MON

1983 1980 1 12

Имея перед глазами эти результаты, найти количество месяцев между датами MAX HD и MIN HD не составляет труда: (1983-1980)*12 + (1-12). Чтобы вычислить, сколько лет прошло между этими датами, делим количество месяцев на 12. Округления выполняются соответственно предъявляемым требованиям.

Oracle и SQL Server1

Вложенный запрос Х возвращает граничные значения столбца HIRE-

DATE таблицы EMP:

select min(hiredate) as min hd, max(hiredate) as max hd from emp



Описанное ниже решение вычисляет разницу в секундах с учетом только целых дней. В СУБД, в которых для хранения даты используется тип данных, который хранит еще и время, такое решение является не совсем точным. В MySQL и SQL Server для точного вычисления можно использовать функцию DATEDIFF с аргументами диапазона HOUR, MINUTE, SECOND. -Примеч. науч. ред.

MIN HD MAX HD

17-DEC-1980 12-JAN-1983

Функции, поставляемые Oracle и SQL Server (MONTHS BETWEEN и DATEDIFF соответственно), возвратят количество месяцев между двумя заданными датами. Чтобы выразить эту разницу в годах, делим результат на 12.

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

Задача

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

Решение1

Если можно найти количество дней между двумя датами, следовательно, полученное значение можно выразить в секундах, минутах и часах, поскольку это единицы измерения времени, составляющие день.

Чтобы найти разницу между значениями ALLEN HD и WARD HD в днях, используйте функцию DAYS. Затем посредством умножения выразите это значение в разных единицах времени:

1 select dy*24 hr, dy*24*60 min, dy*24*60*60 sec

2 from (

3 select ( days(max(case when ename = WARD

4 then hiredate

5 end)) -

6 days(max(case when ename = ALLEN

7 then hiredate

8 end))

9 ) as dy

10 from emp

11 ) x



MySQL и SQL Server

Чтобы возвратить количество дней между датами ALLEN HD и WARD HD, используйте функцию DATEDIFF. Затем посредством умножения выразите это значение в разных единицах времени:

1 select datediff(day,allen hd,ward hd)*24 hr,

2 datediff(day,allen hd,ward hd)*24*60 min,

3 datediff(day,allen hd,ward hd)*24*60*60 sec

4 from (

5 select max(case when ename = WARD

6 then hiredate

7 end) as ward hd,

8 max(case when ename = ALLEN

9 then hiredate

10 end) as allen hd

11 from emp

12 ) x

Oracle и PostgreSQL

Чтобы получить число дней между датами приема на работу ALLEN и WARD, найдите разность между значениями ALLEN HD и WARD HD. Затем посредством умножения выразите это значение в разных единицах времени:

select

dy*24 as hr, dy*24*60 as min,

from

select

(max(case when ename = WARD

then hiredate

end) -

max(case when ename = ALLEN

then hiredate

end)) as dy

from

Обсуждение

Во всех решениях вложенный запрос Х возвращает значения HIRE-DATE для служащих WARD и ALLEN, как показано ниже:

select max(case when ename = WARD then hiredate end) as ward hd, max(case when ename = ALLEN then hiredate end) as allen hd

from emp

WARD HD

ALLEN HD

22-FEB-1981 20-FEB-1981



1 ... 75 76 77 [ 78 ] 79 80 81 ... 219

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