【问题标题】:Difference between two Year Month and Day values in OracleOracle中两个年月日值之间的差异
【发布时间】:2016-02-24 04:13:44
【问题描述】:

我有两组年、月和日值。例如。 15岁7个月23天和7岁9个月12天。可以根据年、月和日找到两个这样的值之间的差异吗?我曾考虑将值转换为天数,计算差异,然后再次将结果转换回年、月和日?为此,我必须假设 30 天/月和 365 天/年。这种方法可以吗?

【问题讨论】:

  • “没事”是什么意思?您的业​​务用户需要告诉您假设月份正好有 30 天而年份正好有 365 天是否合理,并且需要验证计算是否“正常”。我们不了解您的业务,我们不知道数据代表什么,因此我们不知道适合您业务的算法。
  • 贾斯汀,“没问题”我想说的是,从计算的角度来看,这种方法是否会提供正确的结果。数据代表员工的服务期限。而且,用户无法指导应该进行什么/如何进行计算。
  • 您需要定义“正确的结果”。 2个月大于1个月29天吗?这取决于月份。对于您要解决的任何问题,也许可以休息几天。

标签: oracle


【解决方案1】:

当您仔细考虑它时,您会意识到当月份到位时,您无法计算两个“时间间隔”的差异;仅仅因为减去几个月可能会导致不同的天数。你可以减去年,你可以减去周,你可以减去天,……你可以减去天到秒,你可以减去年到月。但是,您不能减去年数。

示例:

SQL> select timestamp'1915-07-23 00:00:00' - timestamp'1907-09-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002871 00:00:00

这是基于 1900 年 1 月 1 日的 15 年 7 个月 23 天减去 7 年 9 个月 12 天。这给了我们 2871 天的差异。

但是,请考虑以下两个示例,只是将过去 1 个月和 6 个月移到过去

select timestamp'1915-06-23 00:00:00' - timestamp'1907-08-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002872 00:00:00

select timestamp'1915-01-23 00:00:00' - timestamp'1907-03-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002874 00:00:00

SQL> 

这些现在给了我们 2872 天和 2874 天的差异。

现在,说到可能的减法...

(a) 减去每年的间隔

SQL> select interval'1915-07' year(4) to month - interval'1907-09' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

select interval'1915-06' year(4) to month - interval'1907-08' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

select interval'1915-01' year(4) to month - interval'1907-03' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

SQL> 

所有三个都正确地产生了 7 年零 10 个月的差异。

(b) 减去每一秒的间隔

SQL> select interval'15 01:02:03' day(2) to second - interval'07 02:03:04' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

select interval'14 00:01:02' day(2) to second - interval'06 01:02:03' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

select interval'09 11:12:13' day(2) to second - interval'01 12:13:14' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

SQL> 

所有三个都产生相同的结果,因为所有三个都是按天/秒间隔减去间隔值的天/小时/分钟/秒部分。

(c) 减去每年的间隔

正如我所说:不可能。在 Oracle 中甚至没有逐日间隔这样的东西。数据库服务器的制造商知道为什么他们决定不将这些添加到引擎中。

【讨论】:

  • nop77svk,非常感谢您的回复和努力。不知何故找到了解决问题的办法。我只是将年月日的集合添加到 sysdate 中,找出获得的两个日期之间的差异,并将结果再次转换为年月日。
  • @IRoy,我只是希望你意识到你会得到不一致的结果,这取决于实际的 sysdate。
  • 当然可以。以 sysdate 为基础,每个月的结果都会有所不同。因此,基数现在是固定日期,结果与各种输入值一致。让我们看看用户明天要说什么。
猜你喜欢
  • 2014-04-07
  • 2022-10-02
  • 2013-07-17
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多