2016-04-15 101 views
-2
select to_char(systimestamp-1/24,'dd-mm-yy hh24:mi:ss') from dual; 

上面的查詢在oracle中工作。但我也需要在mysql中工作,因爲我的應用程序應該可以在兩個數據庫中工作,而且每次都不用更改查詢。那麼是否有任何等同的查詢可以得到相同的結果,並且應該可以在兩個數據庫中工作。to_char相當於應該在oracle和mysql中工作

+2

如果使用兩個不同的數據庫,你只需要接受查詢會有所不同。相應地設計你的應用。 –

+0

兩個不同的存儲過程/函數返回相同的值? – jarlh

+0

@GordonLinoff其實它是一箇舊的應用程序,我在db團隊,並沒有預期的變化,除了這一個。有沒有任何工作可以這樣做。 –

回答

0

正如在評論中提到的那樣,當使用兩個不同的DBMS時,由於SQL方言的差異,應該接受查詢不同。

CURRENT_TIMESTAMP然而,它是標準的SQL,並且可以在兩個DBMS中使用。 FROM DUAL不是標準的SQL,但兩個DBMS都具有它的特徵。因此,只需做

select current_timestamp from dual; 

並使用您的客戶端應用程序來減去一小時並根據您的意願顯示數據。

另一種選擇是寫在兩個DBMS

create view current_datetime_string as 
select ... as value from dual; 

視圖,然後選擇字符串作爲

select value from current_datetime_string; 
0

這將在Oracle和MySQL的:

SELECT CURRENT_TIMESTAMP - INTERVAL '1' HOUR 
FROM DUAL; 

(請注意difference between SYSTIMESTAMP and CURRENT_TIMESTAMP

然而,格式化爲一個字符串需要TO_CHAR()在甲骨文:

SELECT TO_CHAR(CURRENT_TIMESTAMP - INTERVAL '1' HOUR, 'dd-mm-yy hh24:mi:ss') 
FROM DUAL; 
在MySQL

DATE_FORMAT()

SELECT DATE_FORMAT(CURRENT_TIMESTAMP - INTERVAL '1' HOUR, '%d-%m-%y %H:%i:%s') 
FROM DUAL; 

您可以在Oracle中創建(或MySQL)的函數,將轉換一個到另一個:

CREATE FUNCTION DATE_FORMAT(value DATE, mask VARCHAR2) 
    RETURN VARCHAR2 DETERMINISTIC 
AS 
    p_mask VARCHAR2(4000) := mask; 
BEGIN 
    p_mask := REPLACE(p_mask, '%Y', 'YYYY'); 
    p_mask := REPLACE(p_mask, '%y', 'YY'); 
    p_mask := REPLACE(p_mask, '%b', 'MON'); 
    p_mask := REPLACE(p_mask, '%M', 'MONTH'); 
    p_mask := REPLACE(p_mask, '%m', 'MM'); 
    p_mask := REPLACE(p_mask, '%a', 'DY'); 
    p_mask := REPLACE(p_mask, '%d', 'DD'); 
    p_mask := REPLACE(p_mask, '%H', 'HH24'); 
    p_mask := REPLACE(p_mask, '%h', 'HH12'); 
    p_mask := REPLACE(p_mask, '%i', 'MI'); 
    p_mask := REPLACE(p_mask, '%s', 'SS'); 
    RETURN TO_CHAR(value, p_mask); 
END; 
/

然後你可以使用th e Oracle中的MySQL查詢(反之亦然,如果實現反函數)。

如果你真的不想使用的功能,以協助轉換那麼這應該在MySQL和甲骨文工作:

SELECT CONCAT(
     CASE WHEN MOD(EXTRACT(YEAR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR), 100) < 10 
       THEN CONCAT('0', MOD(EXTRACT(YEAR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR), 100)) 
       ELSE CONCAT('', MOD(EXTRACT(YEAR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR), 100)) 
       END, 
     '-', 
     CASE WHEN EXTRACT(MONTH FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR) < 10 
       THEN CONCAT('0', EXTRACT(MONTH FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       ELSE CONCAT('', EXTRACT(MONTH FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       END, 
     '-', 
     CASE WHEN EXTRACT(DAY FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR) < 10 
       THEN CONCAT('0', EXTRACT(DAY FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       ELSE CONCAT('', EXTRACT(DAY FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       END, 
     ' ', 
     CASE WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR) < 10 
       THEN CONCAT('0', EXTRACT(HOUR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       ELSE CONCAT('', EXTRACT(HOUR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       END, 
     ':', 
     CASE WHEN EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR) < 10 
       THEN CONCAT('0', EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       ELSE CONCAT('', EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       END, 
     ':', 
     CASE WHEN EXTRACT(SECOND FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR) < 10 
       THEN CONCAT('0', EXTRACT(SECOND FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       ELSE CONCAT('', EXTRACT(SECOND FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR)) 
       END 
     ) AS formatted_date 
FROM DUAL; 
+0

'SELECT LAST_X_HRS, to_char(max(create_date)-LAST_X_HRS/24,'dd-MON-yy hh:mi AM')start_time, to_char(max(create_date) - (LAST_X_HRS-1)/ 24,'dd- MON-YY HH:MI AM ')END_TIME, SUM(TON_PER_HR)作爲TPH FROM DB_OPS_AGGR_DATA 其中module =' BB」 與面積IS NULL GROUP BY LAST_X_HRS ORDER BY LAST_X_HRS ;'謝謝您的回答看起來適合但以上是我的查詢,其中小時數必須動態提供,因此我猜'+間隔'1小時不會工作。任何替代 –

+0

這樣的事情,如果它是可能的'如果有可能'間隔LAST_X_HRS'如果我嘗試它是拋出錯誤 –

+0

你可以在MySQL中執行它(見[SQLFIDDLE](http://sqlfiddle.com/# !9/70b77/2)),但不在Oracle中 - 您需要使用'NUMTODSINTERVAL()'在Oracle中創建一個動態的時間間隔。 – MT0