【问题标题】:Dateadd and Datediff function in oracleoracle 中的 Dateadd 和 Datediff 函数
【发布时间】: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


【解决方案1】:

这种情况下最好的办法是使用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 不同,此函数在闰年可以安全使用。

希望这会有所帮助。

【讨论】:

  • 所以对于 datediff('YEAR', pr.StartDate, SYSDATE) 它将是 MONTHS_BETWEEN(pr.startdate, SYSDATE) / 12
  • MONTHS_BETWEEN(pr.startdate, SYSDATE)/12
  • for datediff('DAY', pr.StartDate, SYSDATE)?
  • 正如我在回答中提到的那样,只需从另一个中减去一个:SYSDATE - pr.startdate,反之亦然。如果您需要绝对值,请将其包装在 ABS(): ABS(SYSDATE - pr.startdate)
  • 我猜我有一个非常复杂的转换。您能否为我提供“dateadd('DAY', -1, dateadd('MONTH', (FLOOR(MONTHS_BETWEEN(p.StartDate, SYSDATE) / p.Duration) + 1) * p.Duration, p. StartDate))" 我已经转换了一点,但是你能提供我转换的部分吗?
【解决方案2】:

由于datediff() 的语义,它们没有简单的精确等价物。它计算两个日期/时间之间的“边界”数量。

我相信这些在语义上是等价的:

trunc(months_between(trunc(pr.StartDate, 'Q'), trunc(sysdate, 'Q')) / 3)
months_between(trunc(pr.StartDate, 'MONTH'), trunc(sysdate, 'MONTH'))

由于截断到季度/月的第一天,这些不应返回分数。

【讨论】:

  • dateadd('DAY', -1, dateadd('MONTH', (FLOOR(MONTHS_BETWEEN(p.StartDate, SYSDATE) / p.Duration) + 1) * p.Duration, p.StartDate )) ..什么是确切的转换,因为我已经完成了一半
  • @jay 。 . .这个问题已经是关于 two 构造(这是相当广泛的)。如果您有另一个问题,请作为另一个问题提出。
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2019-04-18
相关资源
最近更新 更多