【问题标题】:Re-Calculating number of Years, Months, and Days Oracle SQL重新计算年数、月数和天数 Oracle SQL
【发布时间】:2021-06-14 19:39:31
【问题描述】:

我有一个查询返回这个结果:

EmpNo EmpName Years Months Days
111 Ahmed 0 14 39

在这种情况下,我有 14 个月,所以它应该在 years 字段中添加一年并保持 2 月字段中的月,我有39天,所以它应该在月字段中添加一个月,而在天字段中仍然是9天

我如何重新计算年、月和日以获得这样的查询结果:

EmpNo EmpName Years Months Days
111 Ahmed 1 2 9

【问题讨论】:

  • 也许您应该从某个日期开始,例如 1-1-1970,然后将所有位添加到其中(例如添加月份 14),然后提取结果与 1970 年 1 月 1 日之间的差异并提取位.. 事情是,由于月份位,结果可能会有所不同,因为一个月的天数是可变的(1 月 1 日和 2 月 1 日之间的天数与 2 月 1 日和 3 月 1 日之间的天数不同)。如果它是例如“服务期限”,如果您不能容忍近似值,您可能应该使用开始日期(如果知道)
  • 就您的“39 天”解释而言:这是否意味着在这个问题中所有月份都有 30 天?
  • 并非所有案件都有 39 天,可能更少或更多
  • 如果你能提供你的数据来自哪里会更好,这样我们就可以建议一个 e2e 解决方案。

标签: sql oracle


【解决方案1】:

试试这个,但使用日期字段更正确:

UPDATE your_table
SET
    days = mod(days,30),
    months = mod(months,12) + trunc(days/30),
    years = years + trunc(months/12);

COMMIT;

【讨论】:

    【解决方案2】:

    说所有月份都有 30 天似乎很奇怪。但是,如果您假设您需要重新计算所有列。在这种情况下,恢复到天并重新计算所有内容:

    select t.*,
           mod(x.total_days, 30) as days,
           floor(mod(x.total_days, 360) / 30) as months,
           floor(mod(x.total_days / 360)) as years
    from t cross join lateral
         (select t.days + t.months * 30 + t.years * 360 as total_days
          from dual
         ) x;
    

    请注意,这会处理您有 0/11/39 的情况。

    如果您想在update 中使用它,您应该可以使用子查询:

    update (select t.*, t.days + t.months * 30 + t.years * 360 as total_days
            from t
           ) 
        set days = total_days, 30),
            months = floor(mod(total_days, 360) / 30),
            years = floor(mod(x.total_days / 360));
    

    假设一个月有 30 天并且(因此)一年有 360 天似乎有问题,但这完全是另一个问题。

    【讨论】:

      【解决方案3】:

      试试这个。但是,我认为应该是 1 年 3 个月 9 天,否则请告诉我。

      UPDATE your_table
      SET
          days = days - 30,
          months = months + 1
      WHERE
          days > 30;
      
      COMMIT;
      
      UPDATE your_table
      SET
          months = months - 12,
          years = years + 1
      WHERE
          months > 12;
      
      COMMIT;
      

      输出:

      Empno Empname Years Months Days
      -------------------------------
        111   Ahmed      1     3    9
      

      【讨论】:

      • 亲爱的我没有要求更新查询
      • 那样的话,就当当了。
      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 2017-06-24
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多