Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle tương đương với SQL Server / Sybase DateDiff

Tôi đã đánh cắp hầu hết những thứ này từ một bài báo cũ cách đây vài năm, sửa một số lỗi từ bài báo và làm sạch nó. Các đường phân giới cho dateiff được tính toán khác nhau giữa oracle và MSSQL, vì vậy bạn phải cẩn thận với một số ví dụ trôi nổi xung quanh đó không giải thích đúng các ranh giới kiểu MSSQL / Sybase không cung cấp kết quả phân số.

Với những điều sau, bạn sẽ có thể sử dụng cú pháp MSSQL và nhận được kết quả tương tự như MSSQL chẳng hạn như SELECT DATEDIFF (dd, getdate (), DATEADD (dd, 5, getdate ())) FROM DUAL;

Tôi chỉ khẳng định rằng nó hoạt động - không phải là hiệu quả của nó hay cách tốt nhất để làm điều đó. Tôi không phải dân Oracle :) Và bạn có thể muốn suy nghĩ kỹ về việc sử dụng macro hàm của tôi để giải quyết vấn đề cần trích dẫn xung quanh dd, mm, hh, mi..vv.

(cập nhật của Mark Harrison) đã thêm chức năng dy làm bí danh cho 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. Làm cách nào để tạo trường varchar2 ngắn hơn trong Oracle?

  2. Làm thế nào để tạo bảng trong Oracle SQL Developer?

  3. Không thể mở lib '/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1 khi tạo mục Database Monitor trong zabbix

  4. CHR (0) trong REGEXP_LIKE

  5. Bảo mật cơ sở dữ liệu Oracle:Kiểm tra cơ sở dữ liệu