|
Программирование >> Преобразование значений null
Oracle Сочетание функций ROWNUM, TRUNC и ADD MONTHS значительно упрощает решение. Чтобы найти дату начала каждого квартала, просто добавляем n месяцев к первому дню года, где n - это (ROWNUM - 1)х3 (что в результате дает 0, 3, 6, 9). Чтобы найти дату окончания каждого квартала, добавляем n месяцев к первому дню года, где n - это ROWNUM, умноженное на 3, и вычитаем один день. Отметим, что при работе с кварталами может быть полезным использование функций TO CHAR и/или TRUNC с форматной маской q. PostgreSQL Первый шаг - с помощью функции DATE TRUNC, исходя из текущей даты, получить первый день текущего года. Затем добавить n месяцев, где n - значение столбца RN (RN содержит значения, возвращенные функцией GENERATE SERIES), умноженное на три, и вычесть один день. Результаты показаны ниже: select date(dy+((rn*3) * interval 1 month))-1 as dy from ( select rn, date(date trunc(year,current date)) as dy from generate series(1,4) gs(rn) ) x 31-MAR-2005 30-JUN-2005 30-SEP-2005 31-DEC-2005 Теперь после получения конечных дат всех кварталов остается последний шаг - найти начальные даты. Для этого из каждого значения DY вычитаем два месяца и с помощью функции DATE TRUNC переходим к первому дню полученного месяца. Применяя функцию TO CHAR к конечной дате каждого квартала (DY), определяем, какому кварталу соответствуют начальная и конечная даты. MySQL Первый шаг - найти первый день года, используя функции ADDDATE и DAYOFYEAR. Затем с помощью функции DATEADD добавить n месяцев к первому дню года, где n - значение T500.ID, умноженное на три. Результаты представлены ниже: select date add(dy,interval (3*id) month) dy from ( select id, adddate(current date,-dayofyear(current date)+1) dy from t500 where id <= 4 01-APR-2005 01-JUL-2005 01-OCT-2005 01-JAN-2005 На данный момент возвращены даты, соответствующие следующему дню после окончания каждого квартала. Чтобы найти последний день каждого квартала, просто вычтем по одному дню из всех значений DY. Следующий шаг - найти даты начала кварталов, для этого вычитаем по три месяца из каждого значения DY. Применяем функцию QUARTER к конечной дате каждого квартала, чтобы определить, какому кварталу соответствуют начальная и конечная даты. SQL Server Первый шаг - найти первый день года. Затем, используя функцию DATEADD, рекурсивно добавить по n месяцев, где n - номер текущей итерации, умноженный на три (всего выполняется четыре итерации, следовательно, добавляется 3*1 месяцев, 3*2 месяцев и т. д.). Результаты показаны ниже: with x (dy,cnt) as ( select dateadd(d,-(datepart(dy,getdate())-1),getdate()), 1 from t1 union all select dateadd(m,3,dy), cnt+1 from x where cnt+1 <= 4 select dy from x 01-APR-2005 01-JUL-2005 01-OCT-2005 01-JAN-2005 Значения DY соответствуют следующим дням после окончания каждого квартала. Чтобы получить даты окончания кварталов, просто вычитаем один день из значений DY, используя функцию DATEADD. Чтобы найти дату начала каждого квартала, с помощью функции DATEADD вычитаем три месяца из каждого значения DY. Применяя функцию DATEPART к конечным датам кварталов, определяем, к каким кварталам относятся полученные начальные и конечные даты. В решениях для этой СУБД и всех следующих можно получить год, разделив значение YYYYQ на 10; этот вариант ближе к способу получения квартала путем вычисления остатка от деления, чем использование функции SUBSTR. - Примеч. науч.ред. Определение дат начала и окончания заданного квартала Задача Год и квартал заданы в формате YYYYQ (четыре разряда - год, один разряд - квартал), требуется получить даты начала и окончания квартала. Решение Ключ к решению - применить к значению YYYYQ функцию вычисления остатка от деления. (Поскольку год представлен четырьмя разрядами, вместо нахождения остатка от деления можно просто извлечь последний разряд как подстроку.) Получив номер квартала, просто умножаем это значение на 3, чтобы найти месяц окончания квартала. В представленных решениях вложенный запрос Х возвращает все четыре сочетания года и кварталов. Результирующее множество вложенного запроса Х следующее: select 20051 as yrq from t1 union all select 20052 as yrq from t1 union all select 20053 as yrq from t1 union all select 20054 as yrq from t1 20051 20052 20053 20054 Используйте функцию SUBSTR, чтобы возвратить год из вложенного запроса Х. С помощью функции MOD определите искомый квартал:1 1 select (q end-2 month) q start, 2 (q end+1 month)-1 day q end 3 from ( 4 select date(substr(cast(yrq as char(4)),1,4) M-M 5 rtrim(cast(mod(yrq,10)*3 as char(2))) -1) q end 6 from ( 7 select 20051 yrq from t1 union all 8 select 20052 yrq from t1 union all 9 select 20053 yrq from t1 union all
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |