Oracle常用日期格式函数-sql和Mysql

Common date format function for Oracle-sql and Mysql

我需要为 MySQL 和 Oracle 数据库编写通用查询。当我必须输入日期条件时会出现问题。 例如:有一个字段Txn_date,在MySQL中是'20150116',在Oracle中是'16-JAN-2015'

我对 MySQL 使用 date_format(now(),'%Y%m%d'),对 Oracle 使用 to_char(sysdate,'dd-MON-YYYY')

我可以在 Oracle 和 MySQL 中使用相同的函数吗?

我尝试了 Txn_date in ( date_format(now(),'%Y%m%d') OR to_char(sysdate,'dd-MON-YYYY') ) 但没有成功,因为 to_char() 在 MySQL 中无法识别。

MySQL 和 Oracle 使用不同的语法将日期转换为字符串 - 您将不得不使用不同的查询。

首先,在 MySQL 中,日期在隐式转换时通常具有以下格式 - 2015-01-16 - 而不是 20150116。我认为您可以在 MySQL Oracle 中执行以下操作(它是标准的 SQL)- 我已经在 Oracle (10g) 中检查过它并且它可以工作, 它似乎有效 in my fiddling with MySQL:

SELECT * FROM mytable
 WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );

要转换为 DATE 的字符串文字必须采用 yyyy-mm-dd 格式。现在,如果您的日期是 dates 并且没有时间部分,这将起作用。现在,如果您的日期确实有时间部分,那么事情会变得更加困难,因为 MySQL 使用 DATE() 函数来获取日期部分,而 Oracle 会使用 TRUNC()。但是你可以通过明智地使用 >=< 来解决这个问题,例如:

SELECT * FROM mytable
 WHERE ( mydate >= DATE '2015-01-16' AND mydate < DATE '2015-01-17' )
    OR ( mydate >= DATE '2015-01-18' AND mydate < DATE '2015-01-19' );

现在,如果您想使用 SYSDATE,最好的办法是使用 ANSI 标准 CURRENT_DATECURRENT_TIMESTAMP。这些可以直接比较而不需要格式化,并且应该在 MySQL 和 Oracle 中工作。您还可以使用 INTERVAL 进行日期运算,在这种情况下您可以尝试以下操作:

SELECT * FROM mytable
 WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;

更新 我一直在思考这个问题。如果您想获取今天 已输入的所有行,则上面的查询实际上不起作用。困难在于 Oracle 将 ANSI 日期文字识别为日期(即没有时间部分),但据我所知,没有一种 ANSI 标准的方法来转换 date/time 值(Oracle DATE 是)到 date。也就是说,Oracle 和 MySQL 都支持 EXTRACT() 函数,因此您应该能够执行以下操作来获取 今天 的记录:

SELECT * FROM mytable
 WHERE EXTRACT(YEAR FROM mydate) = EXTRACT(YEAR FROM CURRENT_DATE)
   AND EXTRACT(MONTH FROM mydate) = EXTRACT(MONTH FROM CURRENT_DATE)
   AND EXTRACT(DAY FROM mydate) = EXTRACT(DAY FROM CURRENT_DATE);

绝对笨拙,尤其是当一个人有多个日期要考虑时(我假设你这样做,因为你正在使用 IN 运算符),但应该在两个平台上工作。 See SQL Fiddle Demo here (MySQL) and here (Oracle).