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