|
Программирование >> Преобразование значений null
01-FEB-2005 Следующий шаг - с помощью функции MONTH из даты, возвращенной вложенным запросом TMP1, получить месяц: select dy, month(dy) as mth from ( select (current date - dayofyear(current date) days +1 days) +1 months as dy from t1 ) tmp1 DY MTH 01-FEB-2005 2 Представленные до сих пор результаты обеспечивают отправную точку для рекурсивной операции, в ходе которой генерируется каждый день февраля. Чтобы получить все дни февраля, многократно добавляем по одному дню к DY, до тех пор пока не будет возвращено 1 марта. Результаты выполнения операции WITH приведены ниже: with x (dy,mth) as ( select dy, month(dy) from ( select (current date - Последний день февраля также можно получить путем вычитания одного дня из первого дня марта. - Примеч. науч. ред. Обсуждение1 DB2 Вложенный запрос TMP1 в рекурсивном представлении X возвращает первый день февраля следующим образом: 1. Определяется текущая дата. 2. С помощью функции DAYOFYEAR определяется, сколько дней нынешнего года прошло до текущей даты. 3. Вычитанием найденного количества дней из текущей даты получается 31 декабря предыдущего года, и добавляется один день, чтобы достичь 1 января текущего года. 4. Добавляется один месяц, чтобы получить 1 февраля. Результат всех этих вычислений представлен ниже: select (current date - dayofyear(current date) days +1 days) +1 months as dy from t1 28-FEB-2005 2 Заключительный шаг - применить к столбцу DY функцию MAX, чтобы выбрать последний день февраля. Если это окажется 29-е число, то год - високосный. Oracle Первый шаг - найти начало года, используя функцию TRUNC: select trunc(sysdate,y) from t1 01-JAN-2005 Поскольку первый день года - 1 января, следующий шаг - добавляем один месяц, чтобы получить 1 февраля: select add months(trunc(sysdate,y),1) dy from t1 01-FEB-2005 Далее с помощью функции LAST DAY находим последний день февраля: select last day(add months(trunc(sysdate,y),1)) dy from t1 28-FEB-2005 Последний шаг (необязательный) - используем функцию TO CHAR, чтобы возвратить 28 или 29. dayofyear(current date) days +1 days) +1 months as dy from t1 ) tmp1 union all select dy+1 days, mth from x where month(dy+1 day) = mth select dy,mth from x DY MTH 01-FEB-2005 2 10-FEB-2005 2 01-JAN-2005 Следующий шаг - добавляем месяц к первому дню текущего года, чтобы получить первый день февраля, приводя результат к типу DATE: select cast(cast( date trunc(year,current date) as date) + interval 1 month as date) as dy from t1 01-FEB-2005 Далее возвращаем из вложенного запроса TMP1 значение DY, выбирая из него с помощью функции TO CHAR порядковый номер месяца: select dy, to char(dy,MM) as mth from ( select cast(cast( date trunc(year,current date) as date) + interval 1 month as date) as dy from t1 ) tmp1 DY MTH 01-FEB-2005 2 Представленные до сих пор результаты составляют результирующее множество вложенного запроса TMP2. Следующий шаг - с помощью исключительно полезной функции GENERATE SERIES получить 29 строк (со значениями от 1 до 29). Каждая возвращенная GENERA-TE SERIES строка (множество этих строк образует множество под псевдонимом Х) добавляется к DY вложенного запроса TMP2. Результаты частично показаны ниже: select tmp2.dy+x.id as dy, tmp2.mth from ( select dy, to char(dy,MM) as mth from ( select cast(cast( date trunc(year,current date) as date) + interval 1 month as date) as dy PostgreSQL Первый шаг - проверить результаты, возвращенные вложенным запросом TMP1. С помощью функции DATE TRUNC находим первый день текущего года и приводим результат к типу DATE: select cast(date trunc(year,current date) as date) as dy from t1
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |