|
Программирование >> Преобразование значений null
В 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. Затем посредством умножения выразите это значение в разных единицах времени:
Обсуждение Во всех решениях вложенный запрос Х возвращает значения 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |