Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle和mysql中都可以使用的to_char等价物_Mysql_Sql_Database_Oracle - Fatal编程技术网

在oracle和mysql中都可以使用的to_char等价物

在oracle和mysql中都可以使用的to_char等价物,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,上述查询在oracle中工作。但我还需要在mysql中使用它,因为我的应用程序应该在两个数据库中都可以使用,而不必每次都更改查询。因此,对于上述问题,是否有任何等价的查询会给出相同的结果,并且应该在两个数据库中都可以使用。如注释中所述,当使用两个不同的DBMS时,应该接受查询不同,因为SQL方言不同 CURRENT_TIMESTAMP,但它是标准SQL,在两种DBMS中都可用不是标准的SQL,但两个DBMS都有它的功能。那就这么简单吧 select to_char(systimestamp-1/

上述查询在oracle中工作。但我还需要在mysql中使用它,因为我的应用程序应该在两个数据库中都可以使用,而不必每次都更改查询。因此,对于上述问题,是否有任何等价的查询会给出相同的结果,并且应该在两个数据库中都可以使用。

如注释中所述,当使用两个不同的DBMS时,应该接受查询不同,因为SQL方言不同

CURRENT_TIMESTAMP
,但它是标准SQL,在两种DBMS中都可用<来自DUAL的代码>不是标准的SQL,但两个DBMS都有它的功能。那就这么简单吧

select to_char(systimestamp-1/24,'dd-mm-yy hh24:mi:ss') from dual;
使用你的客户端应用程序减去一小时,并根据你的意愿显示数据

另一种选择是在两个DBMS中都写一个视图

select current_timestamp from dual;
然后选择字符串作为

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

这在Oracle和MySQL中都适用:

select value from current_datetime_string;
(请注意以下事项)

但是,在Oracle中,将其格式化为字符串需要
到\u CHAR()

SELECT CURRENT_TIMESTAMP - INTERVAL '1' HOUR
FROM   DUAL;
MySQL中的
DATE\u FORMAT()

SELECT TO_CHAR( CURRENT_TIMESTAMP - INTERVAL '1' HOUR, 'dd-mm-yy hh24:mi:ss' )
FROM   DUAL;
您可以在Oracle(或MySQL)中创建一个函数,将一个函数转换为另一个函数:

SELECT DATE_FORMAT( CURRENT_TIMESTAMP - INTERVAL '1' HOUR, '%d-%m-%y %H:%i:%s' )
FROM   DUAL;
然后,您可以在Oracle中使用MySQL查询(如果您实现了反向函数,则反之亦然)

如果您真的不想使用函数来帮助转换,那么这应该可以在MySQL和Oracle中使用:

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;
/
选择CONCAT(
MOD(从当前时间戳提取年份-间隔“1”小时)100小于10时的情况
然后是CONCAT('0',MOD(提取(从当前时间戳开始的年份-间隔'1'小时),100))
ELSE CONCAT(“”,MOD(摘录(从当前时间戳开始的年份-间隔“1”小时),100))
完,,
'-',
提取时的情况(从当前时间戳开始的月份-间隔“1”小时)<10
然后CONCAT('0',提取(从当前时间戳开始的月份-间隔'1'小时))
ELSE CONCAT(“”,提取(从当前时间戳开始的月份-间隔“1”小时))
完,,
'-',
提取时的情况(从当前时间戳开始的日期-间隔“1”小时)<10
然后CONCAT('0',提取(从当前时间戳开始的日期-间隔'1'小时))
ELSE CONCAT(“”,提取(从当前时间戳开始的日期-间隔“1”小时))
完,,
' ',
提取时的情况(从当前时间戳开始的小时-间隔“1”小时)<10
然后CONCAT('0',提取(从当前时间戳开始的小时-间隔'1'小时))
ELSE CONCAT(“”,提取(从当前时间戳开始的小时-间隔“1”小时))
完,,
':',
提取时的情况(从当前时间戳开始的分钟-间隔“1”小时)<10
然后CONCAT('0',提取(从当前时间戳开始的分钟-间隔'1'小时))
ELSE CONCAT(“”,提取(从当前时间戳开始的分钟-间隔“1”小时))
完,,
':',
提取(当前时间戳的秒数-间隔“1”小时)<10时的情况
然后CONCAT('0',提取(当前时间戳的秒-间隔'1'小时))
ELSE CONCAT(“”,提取(当前时间戳的秒-间隔“1”小时))
结束
)日期
来自双重;

如果您使用的是两个不同的数据库,您只需接受不同的查询即可。相应地设计您的应用程序。两个不同的存储过程/函数返回相同的值?@GordonLinoff实际上是一个旧的应用程序我在db团队中,除了这一个,预计不会有任何更改。您的选择是A)为MySQL编写一个to_CHAR()函数,为MySQL实现SYSTIMESTAMP,并实现必要的数学运算,以便从时间戳中减去1/24将减去1小时,B)为Oracle编写MySQL函数DATE_FORMAT和DATEDIFF(可能还有其他函数)的实现,或者C)接受不同的数据库引擎做不同的事情。祝您好运。
选择LAST_X_HRS,to_char(max(create_date)-LAST_X_HRS/24,'dd-MON-yy hh:mi AM')开始时间,to_char(max(create_date)-(LAST_X_HRS-1)/24,'dd-MON-yy hh:mi AM')结束时间,从DB_OPS AGGR数据中以TPH的形式求和(TON_/HR),其中模块和区域为空,按LAST_X_HRS顺序分组,最后一个小时谢谢你的回答,它看起来很合适,但上面是我的查询,其中必须动态提供小时数,因此我猜
+间隔“1”小时
不起作用。任何类似的替代方法,如果有可能的话,请使用
interval LAST_X_HRS
如果有可能的话,因为我尝试了抛出错误,您可以在MySQL中执行此操作(参见此),但不能在Oracle中执行此操作-您需要使用
NUMTODSINTERVAL()
在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;