2008-09-04 17 views
5

ここでは、当社のソフトウェアがインストールされている場所の異なるデータベースベースに接続するためにNHibernateを使用しています。だから、私は多くのSQLプロシージャーをOracleに移植しています。Oracleと同等のSQL Server/Sybase DateDiff

SQL Serverには日付部分、開始日、終了日を取るDateDiffという素晴らしい機能があります。

日付部分の例は、曜日、週、月、年などです。 。

Oracleに相当するものは何ですか?

自分のバージョンを作成する必要がありますか?

(マークハリソンによる更新)オラクルの日付計算について説明するいくつかの素晴らしい答えがあります。 Oracleのdatediff()が必要な場合は、アインシュタインの答えを参照してください。 (これは、SybaseとOracleの間で互換性のあるSQLスクリプトを維持するために必要です)。この問題はSybaseにも等しく当てはまります。

+0

はこちらをご覧:(このリンクがまだ壊れている場合は、下のリンクを使用してください) http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551242712657900129 –

答えて

1

トムの記事は非常に古いです。 DATE型についてのみ説明します。 TIMESTAMP型を使用すると、PL/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 
4

JohnLavoie - あなたはそれを必要としません。 OracleのDATEは、実際には日付と時刻のデータ型です。 DATEとTIMESTAMPの唯一の違いは、DATEが2番目に解決されますが、TIMESTAMPはマイクロ秒まで解決されることです。したがって、Ask Tomの記事は、TIMESTAMP列に対しても完全に有効です。

4

私は数年前に古いトムの記事からこの記事のほとんどを盗んで、記事からいくつかのバグを修正し、それを掃除しました。 datediffの境界線は、OracleとMSSQLの間で異なって計算されるため、分数結果を提供しないMSSQL/Sybaseスタイルの境界を適切に考慮していないいくつかの例を注意してください。

以下では、MSSQL構文を使用して、SELECT DATEDIFF(dd、getdate()、DATEADD(dd、5、getdate())などのMSSQLと同じ結果を得ることができます。

私はそれが効果的であると主張しています。それを行うには効果的ではありません。私はOracleの人ではありません:)そして、関数マクロを使用してdd、mm、hh、miなどの引用符を必要とする回避策を2回考えてみたいです。

(マークハリソンによる更新) ddの機能を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; 
/
0

この

function  datediff(p_what in varchar2, p_d1 in date, p_d2 in date) return number as l_result number; 
BEGIN 
     select (p_d2-p_d1) * 
      decode(upper(p_what), 'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL) 
     into l_result from dual; 

     return l_result; 
END; 

用のOracleでの関数を記述し、好き、それを使用することができます。

DATEDIFF('YYYY-MM-DD', SYSTIMESTAMP, SYSTIMESTAMP)