Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Вычеслить кол-во месяцов из двух дат


Автор: kentaro 22.2.2010, 12:07
Как вычеслить кол-во месяце из двух дат?

Автор: password 22.2.2010, 16:46
Код

select (trunc(sysdate)-to_date('01.01.2010','dd.mm.yyyy'))/30 kols from dual


Ну это если грубо взять среднее кол-во дней в месяце за 30 )))

Автор: ToshaCh 22.2.2010, 17:39
Внезапно первая ссылка в гугле: http://www.techonthenet.com/oracle/functions/months_between.php

Автор: kentaro 23.2.2010, 14:41
Большое спасибо smile 

Автор: kentaro 26.2.2010, 12:47
ToshaCh, А есть ли такие же функции для подсчёта дней,лет?

Автор: ToshaCh 26.2.2010, 13:02
Ну для дней тут тупо trunc(date1-date2), т.к. результат любой арифметики от двух дат это number. А для годов вроде нет специальной функции, но, опять таки внезапно, months_between/12.

Автор: kentaro 26.2.2010, 14:53
ToshaCh, 
Не знаю почему но в процедуре он не работает,хотя должен показывать разность дней,лет,годов и.т.д
Код

select  to_char(trunc(sysdate) + (dt2 - dt1),'hh24:mi:ss') into vDay,
       lpad(trunc(dt2) - trunc(add_months(dt1,trunc(months_between(dt2, dt1)))),2,'0')||'.'||
       lpad(trunc(mod(months_between(dt2, dt1),12)),2,'0')||'.' ||
       lpad(trunc(months_between(dt2, dt1)/12),4,'0')||' '||
      
  from (select to_date(Date2, 'dd.mm.yyyy') dt2, to_date(Date1, 'dd.mm.yyyy') dt1 from dual);


Автор: Zloxa 27.2.2010, 13:05
Цитата(kentaro @  26.2.2010,  14:53 Найти цитируемый пост)
to_date(Date2, 'dd.mm.yyyy') dt2, to_date(Date1, 'dd.mm.yyyy') dt1

Date1,Date2 - какого типа?

Автор: kentaro 27.2.2010, 15:43
Zloxa, date

Автор: Zloxa 27.2.2010, 15:49
Цитата(kentaro @  27.2.2010,  15:43 Найти цитируемый пост)
date 

А теперь внимательно думаем что мы получим, если к дате сделаем to_date

Добавлено через 1 минуту и 2 секунды
ну или еще более конкретный хинт - какого типа аргумент должен быть у функциии to_date?

Добавлено через 7 минут и 58 секунд
бох с ним и вовсе без намеков.

to_date первым аргументом принимаест строку, потому выполняя указанную конструкцию, оракл дату неявно переобразует в строку используя шаблон, прописанный в nls параметрах сессии. После чего Вы полученную строку явно пытаетесь преобразовать к дате используя шаблон, указанный вторым аргументом. Если шаблоны не совпадают, вы получаете в результате нечто не предсказуемое а не дату.

Автор: kentaro 1.3.2010, 09:49
Zloxa 

Код

select  to_char(trunc(sysdate) + (dt2 - dt1),'hh24:mi:ss') into vDay,
       lpad(trunc(dt2) - trunc(add_months(dt1,trunc(months_between(dt2, dt1)))),2,'0')||'.'||
       lpad(trunc(mod(months_between(dt2, dt1),12)),2,'0')||'.' ||
       lpad(trunc(months_between(dt2, dt1)/12),4,'0')||' '||
      
  from (select Date2 as dt2, Date1 as dt1 from dual);

Всё равно даёт ошибку.А как тогда мне дату привести к нужному формату не используя to_date?

Автор: Zloxa 1.3.2010, 10:01
Цитата(kentaro @  1.3.2010,  09:49 Найти цитируемый пост)
Всё равно даёт ошибку

у тебя  выражение завершается оператором конкатенации, которому, на самом деле нужен еще один операнд.
у тебя into находится совсем не в том месте, где ему следовало бы
Цитата(kentaro @  26.2.2010,  14:53 Найти цитируемый пост)
 в процедуре

В процедуре предпочтительнее использовать процедурный язык для выполенния подобных операций, нежели использовать язык запросов.
Код

  vDay := to_char(trunc(sysdate) + (Date2 - Date1),'hh24:mi:ss')||' '|| 
       lpad(trunc(Date2) - trunc(add_months(Date1,trunc(months_between(Date2, Date1)))),2,'0')||'.'||
       lpad(trunc(mod(months_between(Date2, Date1),12)),2,'0')||'.' ||
       lpad(trunc(months_between(Date2, Date1)/12),4,'0');

Цитата(kentaro @  1.3.2010,  09:49 Найти цитируемый пост)
.А как тогда мне дату привести к нужному формату не используя to_date? 

Дата это уже "нужный формат".

Автор: kentaro 1.3.2010, 12:10
Zloxa, Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)