Количество дней в месяце
У меня есть ежемесячная сумма, которую мне нужно равномерно распределить по количеству дней в месяце. Данные выглядят следующим образом:
Month Value
----------- ---------------
01-Jan-2012 100000
01-Feb-2012 121002
01-Mar-2012 123123
01-Apr-2012 118239
Я должен распределить сумму января на 31 день, сумму февраля на 29 дней и сумму марта на 31 день.
Как я могу использовать PL / SQL, чтобы узнать, сколько дней есть в месяце, указанном в столбце месяц?
7 ответов:
Не используйте
to_char()
и прочее, когда занимаетесь арифметикой с датами. Строки-это строки, а даты-это даты. Пожалуйста, уважайте типы данных и используйте вместо этого:
1+trunc(last_day(date_column))-trunc(date_column,'MM')
Действительно, это верно. Он вычисляет разницу между значением последнего дня месяца и значением Первого (которое, очевидно, всегда равно 1, и поэтому нам нужно снова добавить это 1).
Вы не должны забывать использовать функцию
trunc()
, Если ваши столбцы дат содержат время, потому чтоlast_day()
сохраняет временную составляющую.
Вы можете добавить месяц и вычесть две даты
SQL> ed Wrote file afiedt.buf 1 with x as ( 2 select date '2012-01-01' dt from dual union all 3 select date '2012-02-01' from dual union all 4 select date '2012-03-01' from dual union all 5 select date '2012-01-31' from dual 6 ) 7 select dt, add_months(trunc(dt,'MM'),1) - trunc(dt,'MM') 8* from x SQL> / DT ADD_MONTHS(TRUNC(DT,'MM'),1)-TRUNC(DT,'MM') --------- ------------------------------------------- 01-JAN-12 31 01-FEB-12 29 01-MAR-12 31 31-JAN-12 31