【问题标题】:Convert a BC date to an AD将 BC 日期转换为 AD
【发布时间】:2013-01-21 09:18:42
【问题描述】:

我有日期,早于第 0 年。我需要将它们转换为 AD 日期并再增加 1 年。例如我有BC 16.2.2011 并想要AD 16.2.2012

我们有一个第 3 端 Java 应用程序,其中有时会发生错误;它错误地保存了日期。在上面的示例中,它应该保存 16.2.2012,但在 DB 中,它是 -16.2.2011(它“小了一年”,因为 Oracle 没有零年 - 这很重要)。

转换这些日期很容易,但问题是保存日期应该是29.2.2012,因为没有-29.2.2011。而不是这个日期,它保存-1.3.2011,我无法轻松转换。

有什么方法可以正确转换日期吗?比如从数据库中的转储数据中获取起始年份的秒数?

【问题讨论】:

  • 实际上 IIRC 没有零年,所以 Oracle 在这里是正确的。想想看,人类喜欢从 1 开始数。当然这对你的问题没有帮助。
  • 你为什么用 PL/SQL 标记这个?你需要一个存储过程吗?
  • 我没有弄错problem is when saved date should be like 29.2.2012 because there is no -29.2.2011, so instead of this date it saves -1.3.2011. 部分。在这种情况下您不想增加一天?
  • 无效日期是如何存储的 - 你能添加一个dump 的值,尤其是有问题的值吗?从描述看来,应用程序在插入期间破坏了数据,这可能是 JDBC 错误 - 即使您无法修复应用程序,如果以后的 JDBC 驱动程序仍然有效,它可能会消除该问题,也许?跨度>
  • 我将其标记为 plsql,因为我想编写将日期更正为正确日期的触发器 :) 我无法在 Java 应用程序中进行任何修改,包括更改 JDBC 驱动程序。我只能在 DB 中进行修改。

标签: sql oracle date


【解决方案1】:

如果有问题请告诉我们:

select to_date(to_char(your_bc_date_here,'dd.mm.YYYY'), 'dd.mm.YYYY') + 1 from dual;

这是一个错误演员,因为它不认为年份可能是负数(正确将是syyyy

我已经测试过:your_bc_date = to_date('BC 28.2.2011', 'BC dd.mm.yyyy')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2016-04-03
    • 2010-12-18
    • 2014-07-01
    • 2011-11-06
    相关资源
    最近更新 更多