select to_char(systimestamp-1/24,'dd-mm-yy hh24:mi:ss') from dual;
上面的查詢在oracle中工作。但我也需要在mysql中工作,因爲我的應用程序應該可以在兩個數據庫中工作,而且每次都不用更改查詢。那麼是否有任何等同的查詢可以得到相同的結果,並且應該可以在兩個數據庫中工作。to_char相當於應該在oracle和mysql中工作
select to_char(systimestamp-1/24,'dd-mm-yy hh24:mi:ss') from dual;
上面的查詢在oracle中工作。但我也需要在mysql中工作,因爲我的應用程序應該可以在兩個數據庫中工作,而且每次都不用更改查詢。那麼是否有任何等同的查詢可以得到相同的結果,並且應該可以在兩個數據庫中工作。to_char相當於應該在oracle和mysql中工作
正如在評論中提到的那樣,當使用兩個不同的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;
這將在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;
'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小時不會工作。任何替代 –
這樣的事情,如果它是可能的'如果有可能'間隔LAST_X_HRS'如果我嘗試它是拋出錯誤 –
你可以在MySQL中執行它(見[SQLFIDDLE](http://sqlfiddle.com/# !9/70b77/2)),但不在Oracle中 - 您需要使用'NUMTODSINTERVAL()'在Oracle中創建一個動態的時間間隔。 – MT0
如果使用兩個不同的數據庫,你只需要接受查詢會有所不同。相應地設計你的應用。 –
兩個不同的存儲過程/函數返回相同的值? – jarlh
@GordonLinoff其實它是一箇舊的應用程序,我在db團隊,並沒有預期的變化,除了這一個。有沒有任何工作可以這樣做。 –