to_char等效,应该在oracle和mysql中都有效

时间:2016-04-15 10:50:54

标签: mysql sql database oracle

select to_char(systimestamp-1/24,'dd-mm-yy hh24:mi:ss') from dual;

以上查询适用于oracle。但我还需要在mysql中使用它,因为我的应用程序应该在两个数据库中都可以工作,而不是每次都更改查询。那么上面的任何等效查询都会产生相同的结果,并且应该在两个数据库中都有效。

2 个答案:

答案 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;