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

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


Между заданными двумя датами (включая их) 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

where t500.id <= blake hd-jones hd+1

BLAKE HD

JONES HD

JONES HD+T5

01-MAY-1981

02-APR-1981

02-APR-1981

01-MAY-1981

02-APR-1981

03-APR-1981

01-MAY-1981

02-APR-1981

04-APR-1981

01-MAY-1981

02-APR-1981

05-APR-1981

01-MAY-1981

02-APR-1981

06-APR-1981

01-MAY-1981

02-APR-1981

07-APR-1981

01-MAY-1981

02-APR-1981

08-APR-1981

01-MAY-1981

02-APR-1981

09-APR-1981

01-MAY-1981

02-APR-1981

10-APR-1981

01-MAY-1981

02-APR-1981

11-APR-1981

01-MAY-1981

02-APR-1981

12-APR-1981

01-MAY-1981

02-APR-1981

13-APR-1981

01-MAY-1981

02-APR-1981

14-APR-1981

01-MAY-1981

02-APR-1981

15-APR-1981

01-MAY-1981

02-APR-1981

16-APR-1981

01-MAY-1981

02-APR-1981

17-APR-1981

01-MAY-1981

02-APR-1981

18-APR-1981

01-MAY-1981

02-APR-1981

19-APR-1981

01-MAY-1981

02-APR-1981

20-APR-1981

01-MAY-1981

02-APR-1981

21-APR-1981

01-MAY-1981

02-APR-1981

22-APR-1981

01-MAY-1981

02-APR-1981

23-APR-1981

01-MAY-1981

02-APR-1981

24-APR-1981

01-MAY-1981

02-APR-1981

25-APR-1981

01-MAY-1981

02-APR-1981

26-APR-1981

01-MAY-1981

02-APR-1981

27-APR-1981



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



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

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