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

1 ... 106 107 108 [ 109 ] 110 111 112 ... 219


01-OCT-1983 01-NOV-1983 01-DEC-1983

Имея все необходимые для формирования результирующего множества месяцы, проводим внешнее объединение с EMP.HIREDATE (не забудьте применить функцию TRUNC, чтобы значения EMP.HIREDATE представляли собой первые дни соответствующих месяцев) и применяем к EMP.HIREDATE агрегатную функцию COUNT, чтобы подсчитать, сколько сотрудников было принято на работу в каждом месяце.

SQL Server

Начинаем с получения всех месяцев (на самом деле первого дня каждого месяца) в период с 1980 по 1983 год. Затем находим граничные месяцы, применяя функцию DAYOFYEAR к наименьшему и наибольшему значениям HIREDATE (выявленным посредством функций MIN

и MAX):

select (min(hiredate) -

datepart(dy,min(hiredate))+1) start date, dateadd(yy,1, (max(hiredate) -

datepart(dy,max(hiredate))+1)) end date from emp

START DATE END DATE

01-JAN-1980 01-JAN-1984

Следующий шаг - многократное добавление месяцев, начиная с START DATE, для получения всех необходимых для формирования результирующего множества месяцев. Значение END DATE соответствует следующему дню после окончания рассматриваемого периода. Ничего страшного, мы прекратим рекурсивное добавление месяцев по достижении END DATE (не включая это значение в результат). Полученные месяцы частично показаны ниже:

select adddate(min(hiredate),-dayofyear(min(hiredate))+1) min hd, adddate(max(hiredate),-dayofyear(max(hiredate))+1) max hd from emp ) x

) y,

t500

where date add(min hd,interval t500.id-1 month) <= max hd

01-JAN-1980 01-FEB-1980 01-MAR-1980



with x (start date,end date) as (

select (min(hiredate) -

datepart(dy,min(hiredate))+1) start date, dateadd(yy,1, (max(hiredate) -

datepart(dy,max(hiredate))+1)) end date from emp union all

select dateadd(mm,1,start date), end date from x

where dateadd(mm,1,start date) < end date

select * from x

START DATE END DATE

01-JAN-1980 01-JAN-1984 01-FEB-1980 01-JAN-1984 01-MAR-1980 01-JAN-1984

01-OCT-1983 01-JAN-1984 01-NOV-1983 01-JAN-1984 01-DEC-1983 01-JAN-1984

На данный момент мы имеем все необходимые месяцы. Выполняем

внешнее объединение с EMP.HIREDATE. Поскольку в START DATE

хранятся первые дни месяцев, значения EMP.HIREDATE с помощью функции TRUNC также необходимо преобразовать в первые дни соответствующих месяцев. Последний шаг - применяем агрегатную функцию COUNT к EMP.HIREDATE.

Поиск по заданным единицам времени Задача

Требуется выбрать даты, соответствующие заданному месяцу, или дню недели, или некоторой другой единице времени. Например, необходимо найти всех служащих, которые были приняты на работу в феврале или декабре, а также служащих, нанятых во вторник.

Решение

Для извлечения из даты месяца или названия дня недели используйте функции, предоставляемые СУБД. Этот рецепт может пригодиться во многих случаях, например, для выбора значений HIREDATE по определенному месяцу (или любой другой части даты). В примерах решения данной задачи осуществляется поиск по названию месяца и дня недели. Изучив функции форматирования дат, предоставляемые СУБД, можно без труда внести небольшие коррективы и использовать эти



Обсуждение

Для решения поставленной задачи надо просто знать, какие функции использовать и как с ними работать. Для проверки значений, возвращаемых этими функциями, они помещаются в оператор SELECT. Ниже представлено результирующее множество для служащих 10-го отдела (полученное с помощью синтаксиса SQL Server):

select ename,datename(m,hiredate) mth,datename(dw,hiredate) dw from emp where deptno = 10

ENAME MTH DW

CLARK June Tuesday KING November Tuesday MILLER January Saturday

Когда известно, что возвращает(-ют) функция(-и), использовать ее (их) для поиска строк не составляет труда.

решения для поиска дат по году, кварталу, году и кварталу, месяцу и

году, и т. д. DB2 и MySQL

Чтобы получить название месяца и дня недели приема служащего на работу, используйте функции MONTHNAME (название месяца) и DAY-NAME (название дня) соответственно:

1 select ename

2 from emp

3 where monthname(hiredate) in (February,December)

4 or dayname(hiredate) = Tuesday

Oracle и PostgreSQL

Чтобы получить название месяца и дня недели приема служащего на работу, используйте функцию TO CHAR. С помощью функции RTRIM удалите замыкающие пробелы:

1 select ename

2 from emp

3 where rtrim(to char(hiredate,month)) in (february,december)

4 or rtrim(to char(hiredate,day)) = tuesday

SQL Server

Чтобы получить название месяца и дня недели приема служащего на работу, используйте функцию DATENAME (имя даты):

1 select ename

2 from emp

3 where datename(m,hiredate) in (February,December)

4 or datename(dw,hiredate) = Tuesday



1 ... 106 107 108 [ 109 ] 110 111 112 ... 219

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