Oracle-sql和Mysql的通用日期格式功能

学习者

我需要为MySQL和Oracle数据库编写常见查询。我必须放置日期条件时出现问题。例如:在MySQL和Oracle中有一个Txn_date格式为的字段'20150116''16-JAN-2015'

date_format(now(),'%Y%m%d')用于MySQL和to_char(sysdate,'dd-MON-YYYY')Oracle。

我可以在Oracle和MySQL中使用相同的功能吗?

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

大卫·法伯

首先,在MySQL中,进行隐式转换时,日期通常具有以下格式2015-01-16--而不是20150116我认为您可以在MySQLOracle(这是标准的SQL)中都可以执行以下操作-我已经在Oracle(10g)中对其进行了检查,并且它可以正常工作,并且在我对MySQL的摆弄中似乎可以正常工作

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

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

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标准的转换日期/时间值的方式(OracleDATE是)约会也就是说,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运算符),但是应该在两个平台上都可以使用。在此处(MySQL)此处(Oracle)参见SQL Fiddle演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章