select to_char(systimestamp-1/24,'dd-mm-yy hh24:mi:ss') from dual;
以上查询适用于oracle。但我还需要在mysql中使用它,因为我的应用程序应该在两个数据库中都可以工作,而不是每次都更改查询。那么上面的任何等效查询都会产生相同的结果,并且应该在两个数据库中都有效。
答案 0 :(得分: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;
答案 1 :(得分:0)
这适用于Oracle和MySQL:
SELECT CURRENT_TIMESTAMP - INTERVAL '1' HOUR
FROM DUAL;
(请注意difference between SYSTIMESTAMP
and CURRENT_TIMESTAMP
)
但是,将其格式化为字符串需要Oracle中的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;
/
然后你可以在Oracle中使用MySQL查询(反之亦然,如果你实现了反函数)。
如果你真的不想使用函数来协助转换,那么这应该适用于MySQL和Oracle:
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;