|
Программирование >> Преобразование значений null
Между заданными двумя датами (включая их) 30 дней. Расположив эти две даты в одной строке, можно перейти к формированию строк, каждая из которых будет соответствовать одному дню этого временного промежутка (всего 30 дней/строк). Для этого используем таблицу T500. Поскольку каждое значение столбца ID таблицы T500 просто на 1 больше предыдущего, то для получения последовательности дней (начиная от JONES HD и до BLAKE HD включительно) каждую строку, возвращаемую T500, добавляем к более ранней из двух дат (JONES HD). Результат показан ниже (с использованием синтаксиса Oracle): select x.*, t500.*, jones hd+t500.id-1 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 emp where ename in ( BLAKE,JONES ) ) x, t500
01-MAY-1981 02-APR-1981 27 28-APR-1981 01-MAY-1981 02-APR-1981 28 29-APR-1981 01-MAY-1981 02-APR-1981 29 30-APR-1981 01-MAY-1981 02-APR-1981 30 01-MAY-1981 Проанализировав предикат WHERE, можно заметить, что для получения требуемых 30 строк мы добавляем 1 к разности между значениями BLAKEHD и JONESHD (в противном случае получилось бы 29 строк). Кроме того, видим, что в списке SELECT внешнего запроса из T500.ID вычитается 1, поскольку значения ID начинаются с 1, и добавление 1 к значению JONES HD привело бы к тому, что оно не было бы включено в окончательный результат. Сгенерировав строки, необходимые для формирования результирующего множества, с помощью выражения CASE отмечаем 1 строки, соответствующие рабочим дням, а 0 - выходные дни. Заключительный шаг - используя агрегатную функцию SUM, подсчитать количество 1 и получить окончательный ответ. Определение количества месяцев или лет между двумя датами Задача Требуется найти разность между двумя датами, в месяцах или годах. Например, поставлена задача определить количество месяцев, прошедших между приемом на работу первого и последнего служащих, а также представить это значение в годах. Решение Поскольку в году всегда 12 месяцев, то чтобы получить результат в годах, можно найти количество месяцев между двумя датами и разделить это значение на 12. Определившись с решением, мы захотим округлить результаты с повышением или с понижением, в зависимости от предъявляемых требований. Например, первое значение столбца HIREDATE таблицы EMP - 17-DEC-1980 , последнее - 12-JAN-1983 . Если проводить вычисления по годам (1983 минус 1980), то получится три года, а разница в месяцах составит примерно 25 (немного больше двух лет). Решение должно отвечать поставленным требованиям. Приведенные ниже решения обеспечивают результат 25 месяцев и ~2 года. DB2 и MySQL С помощью функций YEAR (год) и MONTH (месяц) представьте заданные даты в таком формате: год - четырехзначным числом, месяц -двузначным числом: 1 select mnth, mnth/12 2 from ( 3 select (year(max hd) - year(min hd))*12 + 4 (month(max hd) - month(min hd)) as mnth 5 from ( 6 select min(hiredate) as min hd, max(hiredate) as max hd 7 from emp 8 ) x 9 ) y Oracle Чтобы найти разницу между двумя датами в месяцах, используйте функцию MONTHS BETWEEN (месяцев между) (чтобы выразить результат в годах, просто разделите полученное значение на 12): 1 select months between(max hd,min hd), 2 months between(max hd,min hd)/12 3 from ( 4 select min(hiredate) min hd, max(hiredate) max hd 5 from emp 6 ) x PostgreSQL С помощью функции EXTRACT (извлечь) представьте заданные даты в таком формате: год - четырехзначным числом, месяц - двузначным числом: 1 select mnth, mnth/12 2 from ( 3 select ( extract(year from max hd) - 4 extract(year from min hd) ) * 12 6 ( extract(month from max hd) - 7 extract(month from min hd) ) as mnth 8 from ( 9 select min(hiredate) as min hd, max(hiredate) as max hd 10 from emp 11 ) x 12 ) y SQL Server Чтобы найти разницу между двумя датами в месяцах, используйте функцию DATEDIFF (чтобы выразить результат в годах, просто разделите полученное значение на 12): 1 select datediff(month,min hd,max hd), 2 datediff(month,min hd,max hd)/12 3 from ( 4 select min(hiredate) min hd, max(hiredate) max hd 5 from emp 6 ) x
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |