在oracle和mysql中都可以使用的to_char等价物
上述查询在oracle中工作。但我还需要在mysql中使用它,因为我的应用程序应该在两个数据库中都可以使用,而不必每次都更改查询。因此,对于上述问题,是否有任何等价的查询会给出相同的结果,并且应该在两个数据库中都可以使用。如注释中所述,当使用两个不同的DBMS时,应该接受查询不同,因为SQL方言不同在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/
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;