Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle setara dengan SQL Server/Sybase DateDiff

Saya mencuri sebagian besar dari artikel tom lama beberapa tahun yang lalu, memperbaiki beberapa bug dari artikel dan membersihkannya. Garis demarkasi untuk dateiff dihitung secara berbeda antara Oracle dan MSSQL sehingga Anda harus berhati-hati dengan beberapa contoh yang beredar di luar sana yang tidak memperhitungkan batas gaya MSSQL/Sybase yang tidak memberikan hasil pecahan.

Dengan yang berikut ini Anda harus dapat menggunakan sintaks MSSQL dan mendapatkan hasil yang sama seperti MSSQL seperti SELECT DATEDIFF(dd,getdate(),DATEADD(dd,5,getdate())) FROM DUAL;

Saya hanya mengklaim bahwa itu berhasil - bukan itu yang efisien atau cara terbaik untuk melakukannya. Saya bukan orang Oracle :) Dan Anda mungkin ingin berpikir dua kali untuk menggunakan fungsi makro saya untuk mengatasi kebutuhan tanda kutip di sekitar dd,mm,hh,mi..etc.

(diperbarui oleh Mark Harrison) menambahkan fungsi dy sebagai alias untuk 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;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan Java dengan DB Link tidak menutup koneksi Db Link

  2. PERIKSA KENDALA di Oracle SQL

  3. Oracle tidak membedakan antara null dan string kosong?

  4. Menggabungkan hasil dari kueri SQL di Oracle

  5. Cara mendapatkan elemen pertama dengan XPath di Oracle