5

現在、NHibernate を使用して、ソフトウェアがインストールされている場所に基づいて別のデータベースに接続しています。そのため、多くの SQL プロシージャを Oracle に移植しています。

SQL Server には DateDiff という便利な関数があり、日付部分、開始日、および終了日を取ります。

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

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

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

(Mark Harrison による更新) Oracle の日付演算を説明する素晴らしい回答がいくつかあります。Oracle の datediff() が必要な場合は、Einstein の回答を参照してください。(これは、Sybase と Oracle の間で spme SQL スクリプトの互換性を維持するために必要です。) この質問は Sybase にも同様に当てはまることに注意してください。

4

4 に答える 4

5

数年前の古いトム記事からこのほとんどを盗み、記事からいくつかのバグを修正し、クリーンアップしました。datediff の境界線は、Oracle と MSSQL の間で異なる方法で計算されるため、小数の結果を提供しない MSSQL/Sybase スタイルの境界を適切に考慮していないいくつかの例に注意する必要があります。

以下では、MSSQL 構文を使用して、SELECT DATEDIFF(dd,getdate(),DATEADD(dd,5,getdate())) FROM DUAL; などの MSSQL と同じ結果を取得できるはずです。

私はそれが機能することだけを主張します-それが効率的または最良の方法であるとは言いません。私はOracleの人ではありません:)そして、私の関数マクロを使用して、dd、mm、hh、miなどを引用符で囲む必要があることを回避することについて、よく考えてください。

(Mark Harrison による更新) dd のエイリアスとして dy 関数が追加されました。

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;
/
于 2008-11-23T21:35:47.083 に答える
4

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

于 2008-09-07T09:58:55.523 に答える
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
于 2008-09-04T19:38:23.067 に答える
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;

そしてそれを次のように使用します:

DATEDIFF('YYYY-MM-DD', SYSTIMESTAMP, SYSTIMESTAMP)
于 2014-10-20T12:29:29.843 に答える