【发布时间】:2018-10-05 06:56:13
【问题描述】:
我想使用 Oracle,但 DATEDIFF 和 DATEADD 函数在 Oracle DB 中不起作用。
如何在 Oracle 中编写下面提到的代码?
datediff('QUARTER', pr.StartDate, SYSDATE)
datediff('MONTH', pr.StartDate, SYSDATE)
【问题讨论】:
标签: sql sql-server oracle migration
我想使用 Oracle,但 DATEDIFF 和 DATEADD 函数在 Oracle DB 中不起作用。
如何在 Oracle 中编写下面提到的代码?
datediff('QUARTER', pr.StartDate, SYSDATE)
datediff('MONTH', pr.StartDate, SYSDATE)
【问题讨论】:
标签: sql sql-server oracle migration
这种情况下最好的办法是使用Oracle的MONTHS_BETWEEN()函数。
代替:
datediff('QUARTER', pr.StartDate, SYSDATE)
你会使用:
MONTHS_BETWEEN(pr.startdate, SYSDATE) / 3
而不是:
datediff('MONTH', pr.StartDate, SYSDATE)
你会使用:
MONTHS_BETWEEN(pr.startdate, SYSDATE)
请记住,MONTHS_BETWEEN() 将返回月份的小数部分,因此如果您需要整数,请使用 TRUNC() 或 ROUND()。
当然,如果您需要几天而不是几个月,您可以简单地从另一个日期中减去一个日期,例如,SYSDATE - pr.startdate 或反之亦然。
如果您需要为日期添加天数,您可以简单地这样做:
pr.startdate + 1 -- where 1 is the number of days
如果您需要增加或减少月份,请使用 ADD_MONTHS() 函数 - 与 INTERVALs 不同,此函数在闰年可以安全使用。
希望这会有所帮助。
【讨论】:
MONTHS_BETWEEN(pr.startdate, SYSDATE)/12
SYSDATE - pr.startdate,反之亦然。如果您需要绝对值,请将其包装在 ABS(): ABS(SYSDATE - pr.startdate)
由于datediff() 的语义,它们没有简单的精确等价物。它计算两个日期/时间之间的“边界”数量。
我相信这些在语义上是等价的:
trunc(months_between(trunc(pr.StartDate, 'Q'), trunc(sysdate, 'Q')) / 3)
months_between(trunc(pr.StartDate, 'MONTH'), trunc(sysdate, 'MONTH'))
由于截断到季度/月的第一天,这些不应返回分数。
【讨论】: