Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
почему так можно
declare 
  d1   timestamp;
  d2   timestamp;
begin
d1:=sysdate;
----
dbms_lock.sleep(4);
----
d2:=sysdate;
dbms_output.put_line(LPAD(EXTRACT(MINUTE FROM (d2-d1)),2,'0')||':'||lpad(EXTRACT(SECOND FROM (d2-d1)),2,'0'));
end;

а так, ругается

declare
  d1   date;
  d2   date;
begin
d1:=sysdate;
----
dbms_lock.sleep(4);
----
d2:=sysdate;
dbms_output.put_line(LPAD(EXTRACT(MINUTE FROM (d2-d1)),2,'0')||':'||lpad(EXTRACT(SECOND FROM (d2-d1)),2,'0'));
end;

ORA-06550: line 10, column 27:
PLS-00306: wrong number or types of arguments in call to ' SYS$EXTRACT_FROM'
ORA-06550: line 10, column 1:
PL/SQL: Statement ignored
30 мар 11, 11:46    [10444241]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AmKad
Member

Откуда:
Сообщений: 5121
AlexGru,

Разность таймстампов - интервал, разность дат - number.
30 мар 11, 11:51    [10444278]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
AmKad,
Спасибо. Понятно.
Интерес чисто академический. По идее ведь тип дата содержит всё что нужно.
Как решить эту задачу используя типа date?
30 мар 11, 11:58    [10444342]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
Perepil
Member

Откуда: Санкт-Петербург
Сообщений: 77
Как уже верно заметили, во втором случае вместо d2-d1 надо поставить NUMTODSINTERVAL(d2-d1, 'day')
30 мар 11, 12:01    [10444364]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
:)

declare 
  d1   date;
  d2   date;
  diff INTERVAL DAY TO SECOND;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
diff:=NUMTODSINTERVAL((d2-d1),'DAY');
dm:=EXTRACT(MINUTE FROM diff);
ds:=EXTRACT(HOUR FROM diff);
dbms_output.put_line(dm||' '||ds);
end;

0 0
30 мар 11, 12:08    [10444430]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
AlexGru,
и так 0 0
declare 
  d1   date;
  d2   date;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
dm:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'MINUTE'));
ds:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'SECOND'));
dbms_output.put_line(dm||' '||ds);
end;
30 мар 11, 12:23    [10444539]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15458
AlexGru
:)

[src oracle]


0 0

0 часов 0 минут разницы по истечении 2 секунд
30 мар 11, 12:24    [10444545]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AmKad
Member

Откуда:
Сообщений: 5121
AlexGru
AlexGru,
и так 0 0
declare 
  d1   date;
  d2   date;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
dm:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'MINUTE'));
ds:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'SECOND'));
dbms_output.put_line(dm||' '||ds);
end;
30 мар 11, 12:27    [10444569]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2818
Все понятно.
Только неясно. как бензин по проводам бежит. (С)
30 мар 11, 12:32    [10444615]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15458
AlexGru,

вообще, достаточно и
declare 
  d1   date;
  d2   date;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
ds:=    mod(to_char(d2,'sssss')-to_char(d1,'sssss') ,60);
dm:=floor(((to_char(d2,'sssss')-to_char(d1,'sssss'))/60));
dbms_output.put_line(dm||' '||ds);
end;
30 мар 11, 12:34    [10444633]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
orawish,
Спасибо за вариант.

Перефразирую вопрос.
Можно ли как-то получить разницу в мин:сек между двумя датами, без использования to_char с использованием в каком-нибудь виде типа INTERVAL DAY TO SECOND?
30 мар 11, 12:43    [10444692]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
AmKad
AlexGru
AlexGru,
и так 0 0
ds:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'SECOND'));


declare 
  d1   date;
  d2   date;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
dm:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'MINUTE'));
ds:=EXTRACT(SECOND FROM NUMTODSINTERVAL((d2-d1),'SECOND'));
dbms_output.put_line(dm||' '||ds);
end;

0 .000023148
30 мар 11, 12:47    [10444732]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15458
AlexGru
orawish,
Спасибо за вариант.

Перефразирую вопрос.
Можно ли как-то получить разницу в мин:сек между двумя датами, без использования to_char с использованием в каком-нибудь виде типа INTERVAL DAY TO SECOND?

дык вы же всё, что для этого надо уже получили.
от вас требуется немножко аккуратности
30 мар 11, 12:49    [10444749]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
orawish
AlexGru
orawish,
Спасибо за вариант.

Перефразирую вопрос.
Можно ли как-то получить разницу в мин:сек между двумя датами, без использования to_char с использованием в каком-нибудь виде типа INTERVAL DAY TO SECOND?

дык вы же всё, что для этого надо уже получили.
от вас требуется немножко аккуратности


Спасибо, конечно за педагогичность. Но что-то не вижу.
30 мар 11, 12:56    [10444804]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15458
AlexGru
AmKad
пропущено...


declare 
  d1   date;
  d2   date;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
dm:=EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1),'MINUTE'));
ds:=EXTRACT(SECOND FROM NUMTODSINTERVAL((d2-d1),'SECOND'));
dbms_output.put_line(dm||' '||ds);
end;

0 .000023148

перевожу:
d2-d1 - результат число (дней)
это число ДНЕЙ вы называете числом СЕКУНД и конвертируете в интервал
далее - из интервала извлекаете его содержимое (тут - всё чисто)
30 мар 11, 13:01    [10444849]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
Clipsya
Member

Откуда: Moscow
Сообщений: 83
Можно и так:

set serveroutput on;
declare 
  d1   timestamp;
  d2   timestamp;
begin
d1:=sysdate;
----
dbms_lock.sleep(4);
----
d2:=SYSDATE;
dbms_output.put_line(LPAD(EXTRACT(MINUTE FROM (d2-d1) DAY TO SECOND),2,'0')||':'||lpad(EXTRACT(SECOND FROM (d2-d1) DAY TO SECOND),2,'0'));
end;
30 мар 11, 13:11    [10444955]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
Clipsya
Member

Откуда: Moscow
Сообщений: 83
с DATE тоже будет работать
30 мар 11, 13:13    [10444962]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
Clipsya
с DATE тоже будет работать


Тогда вот вопрос!
Есть 2 варианта.

№1
declare 
  d1   date;
  d2   date;
begin
d1:=SYSDATE;
----
dbms_lock.sleep(4);
----
d2:=SYSDATE;
dbms_output.put_line(EXTRACT(SECOND FROM (d2-d1) DAY TO SECOND));
end;
4

№2
declare 
  d1   date;
  d2   date;
begin
d1:=SYSDATE;
----
dbms_lock.sleep(4);
----
d2:=SYSDATE;
dbms_output.put_line(EXTRACT(SECOND FROM NUMTODSINTERVAL((d2-d1),'SECOND')));
end;
.000046296


orawish
перевожу:
d2-d1 - результат число (дней)
это число ДНЕЙ вы называете числом СЕКУНД и конвертируете в интервал
далее - из интервала извлекаете его содержимое (тут - всё чисто)


Вроде как в обоих случаях так, разница = число ДНЕЙ. Почему один вариант возвращает 4, а другой не совсем.:)

NUMTODSINTERVAL converts n to an INTERVAL DAY TO SECOND literal.
и это (d2-d1) DAY TO SECOND!

Опять так, вот этот вариант работает корректно
declare 
  d1   date;
  d2   date;
begin
d1:=SYSDATE;
----
dbms_lock.sleep(4);
----
d2:=SYSDATE;
dbms_output.put_line(EXTRACT(SECOND FROM NUMTODSINTERVAL((d2-d1)*86400,'SECOND')));
dbms_output.put_line(EXTRACT(MINUTE FROM NUMTODSINTERVAL((d2-d1)*1440,'MINUTE')));
end;


Кто объяснит, почему вариант №1 не требует умножения (d2-d1) на 86400?
31 мар 11, 07:48    [10449205]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2818
AlexGru
NUMTODSINTERVAL converts n to an INTERVAL DAY TO SECOND literal.

ты это откуда взял?
31 мар 11, 10:21    [10449598]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15458
AlexGru,

ну, что же вы? вам всё ведь подсказали.
достаточно назвать день днём.
declare 
  d1   date;
  d2   date;
  dm   number;
  ds   number;
begin
d1:=sysdate;
dbms_lock.sleep(2);
d2:=sysdate;
dm:=EXTRACT(MINUTE FROM NUMTODSINTERVAL( d2-d1 ,'DAY'));
ds:=EXTRACT(SECOND FROM NUMTODSINTERVAL( d2-d1 ,'DAY'));
dbms_output.put_line(dm||' '||ds);
end;
31 мар 11, 10:43    [10449808]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
AlexFF__|
AlexGru
NUMTODSINTERVAL converts n to an INTERVAL DAY TO SECOND literal.

ты это откуда взял?

Из оф доки. Только не скажу версию.
31 мар 11, 12:45    [10450773]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15458
AlexGru
AlexFF__|
пропущено...

ты это откуда взял?

Из оф доки. Только не скажу версию.

если это так - значит опечатка.

вообще, конвертировать что-либо в (любой) литерал нельзя в принципе.
литерал можно вставить/использовать/найти/конвертировать в не_литерал.
31 мар 11, 13:15    [10451026]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
AlexGru
Member

Откуда: Пермь рядом
Сообщений: 1600
orawish,

Ну не совсем "что-либо"

NUMTODSINTERVAL converts n to an INTERVAL DAY TO SECOND literal. The argument n can be any
NUMBER value or an expression that can be implicitly converted to a NUMBER value.
The argument interval_unit can be of CHAR, VARCHAR2, 
NCHAR, or NVARCHAR2 datatype. The value for interval_unit specifies the unit of n and must resolve 
to one of the following string values:
'DAY'
'HOUR'
'MINUTE'
'SECOND'

interval_unit is case insensitive. Leading and trailing values within the parentheses are ignored. 
By default, the precision of the return is 9.

т
31 мар 11, 15:56    [10452447]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
-2-
Member

Откуда:
Сообщений: 15073
SQL> alter session set nls_time_format='hh24:mi';

Session altered.

SQL> select (sysdate-trunc(sysdate-1)) day to second + time '00:00:00' from dual;

(SYSDATE-TRUNC(SYSDATE-1))DAYTOSECOND+TIME'00:00:00'
---------------------------------------------------------------------------
17:16
31 мар 11, 17:16    [10453158]     Ответить | Цитировать Сообщить модератору
 Re: разница минуты и секунды двух дат  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9672
-2-,

Well, I assume it is just for fun. Otherwise TIME literals/datatype are not yet supported.

SY.

Сообщение было отредактировано: 31 мар 11, 17:40
31 мар 11, 17:38    [10453346]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить