Oracle, эквивалентная SQL Server/Sybase DateDiff

Поскольку для отмеченных исключений метод, который их выбрасывает, должен явно указывать этот факт ключевым словом «throws», поэтому, если в вашем блоке нет «throws IOException», у компилятора есть информация, g0] невозможно для исключения IOException, поэтому все, что вы делаете после ловли, было бы недостижимым.

5
задан John Saunders 3 August 2009 в 14:34
поделиться

3 ответа

JohnLavoie - Вам не нужно это. ДАТА в Oracle является на самом деле типом данных даты и времени. Единственная разница между ДАТОЙ и МЕТКОЙ ВРЕМЕНИ - то, что ДАТА решает вниз к второй твердости, но твердости МЕТКИ ВРЕМЕНИ вниз к микро секунде. Поэтому Спросить статья Tom совершенно действительна для столбцов TIMESTAMP также.

4
ответ дан 14 December 2019 в 01:22
поделиться

Статья Tom очень стара. Это только обсуждает тип ДАТЫ. При использовании типов МЕТКИ ВРЕМЕНИ затем, арифметика дат создается в МН / SQL.

http://www.akadia.com/services/ora_date_time.html

DECLARE
ts_a timestamp;
ts_b timestamp;
diff interval day to second;
BEGIN
  ts_a := systimestamp;
  ts_b := systimestamp-1/24;
  diff := ts_a - ts_b;
  dbms_output.put_line(diff);
END;
+00 01:00:00.462000

или

DECLARE
ts_b timestamp;
ts_a timestamp;
date_part interval day to second;

BEGIN
  ts_a := systimestamp;
  date_part := to_dsinterval('0 01:23:45.678');
  ts_b := ts_a + date_part;
  dbms_output.put_line(ts_b);
END;

04-SEP-08 05.00.38.108000 PM
1
ответ дан 14 December 2019 в 01:22
поделиться

Я украл большую часть из этого от старой tom статьи несколько лет назад, исправил некоторые ошибки от статьи и очистил ее. Строки разграничения для datediff вычисляются по-другому между оракулом и MSSQL, таким образом, необходимо быть осторожными с некоторыми примерами, плавающими вокруг там, которые правильно не составляют границы стиля MSSQL/Sybase, которые не обеспечивают дробные результаты.

Со следующим необходимо смочь использовать синтаксис MSSQL и получить те же результаты как MSSQL, такие как ИЗБРАННЫЙ DATEDIFF (dd, getdate (), DATEADD (dd, 5, getdate ())) ОТ ДВОЙНОГО;

Я утверждаю только, что это работает - не что его эффективное или лучший способ сделать это. Я не человек Oracle :) И Вы могли бы хотеть думать дважды об использовании моих функциональных макросов к кавычкам необходимости обходного решения вокруг dd, мм, гд, ми.. и т.д.

(обновление Mark Harrison), добавила функция dy как псевдоним для dd.

CREATE OR REPLACE FUNCTION GetDate 
RETURN date IS today date;
BEGIN
RETURN(sysdate);
END;
/

CREATE OR REPLACE FUNCTION mm RETURN VARCHAR2 IS BEGIN RETURN('mm'); END;
/
CREATE OR REPLACE FUNCTION yy RETURN VARCHAR2 IS BEGIN RETURN('yyyy'); END;
/
CREATE OR REPLACE FUNCTION dd RETURN VARCHAR2 IS BEGIN RETURN('dd'); END;
/
CREATE OR REPLACE FUNCTION dy RETURN VARCHAR2 IS BEGIN RETURN('dd'); END;
/
CREATE OR REPLACE FUNCTION hh RETURN VARCHAR2 IS BEGIN RETURN('hh'); END;
/
CREATE OR REPLACE FUNCTION mi RETURN VARCHAR2 IS BEGIN RETURN('mi'); END;
/
CREATE OR REPLACE FUNCTION ss RETURN VARCHAR2 IS BEGIN RETURN('ss'); END;
/

CREATE OR REPLACE Function DateAdd(date_type IN varchar2, offset IN integer, date_in IN date )
RETURN date IS date_returned date;
BEGIN
date_returned := CASE date_type
    WHEN 'mm'   THEN add_months(date_in,TRUNC(offset))
    WHEN 'yyyy' THEN add_months(date_in,TRUNC(offset) * 12)
    WHEN 'dd'   THEN date_in + TRUNC(offset)
    WHEN 'hh'   THEN date_in + (TRUNC(offset) / 24)
    WHEN 'mi'   THEN date_in + (TRUNC(offset) /24/60)
    WHEN 'ss'   THEN date_in + (TRUNC(offset) /24/60/60)
    END;
RETURN(date_returned);
END;
/

CREATE OR REPLACE Function DateDiff( return_type IN varchar2, date_1 IN date, date_2 IN date)
RETURN integer IS number_return integer;
BEGIN
number_return := CASE return_type
    WHEN 'mm'   THEN ROUND(MONTHS_BETWEEN(TRUNC(date_2,'MM'),TRUNC(date_1, 'MM')))
    WHEN 'yyyy' THEN ROUND(MONTHS_BETWEEN(TRUNC(date_2,'YYYY'), TRUNC(date_1, 'YYYY')))/12
    WHEN 'dd'   THEN ROUND((TRUNC(date_2,'DD') - TRUNC(date_1, 'DD')))
    WHEN 'hh'   THEN (TRUNC(date_2,'HH') - TRUNC(date_1,'HH')) * 24
    WHEN 'mi'   THEN (TRUNC(date_2,'MI') - TRUNC(date_1,'MI')) * 24 * 60
    WHEN 'ss'   THEN (date_2 - date_1) * 24 * 60 * 60
    END;
RETURN(number_return);
END;
/
4
ответ дан 14 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: