【问题标题】:Select and update rows with Date of 00/00/0000 00:00:00 00 in Oracle在 Oracle 中选择并更新日期为 00/00/0000 00:00:00 00 的行
【发布时间】:2021-07-15 01:00:33
【问题描述】:

在我们的 Oracle 数据库中,其中一列的日期值为 00/00/0000 00:00:00 00 的行很少,这会导致带有链接 MS 访问表的连接表达式出现问题。所以我想选择该行并更新或删除它。 我发现我们使用这个查询有这样一个日期:

Select TO_CHAR(Min(INVENTORY_DATE), 'MM/DD/YYYY HH:MI:SS AM') "Min Date"
FROM SOMESCHEMA.INVENTORY;

但它没有出现在这个 Select 查询中:

Select TO_CHAR(INVENTORY_DATE, 'MM/DD/YYYY HH:MI:SS AM') "Inventory Date", MyTable.*
From SOMESCHEMA.INVENTORY MyTable
Where INVENTORY_DATE =  TO_DATE('00/00/0000 00:00:00 00', 'MM/DD/YYYY HH:MI:SS AM ')
order by MyTable.INVENTORY_DATE ASC NULLS LAST
FETCH FIRST 10 ROWS ONLY;

它给了我一个错误,说我需要为月、日、年和 AM/PM 输入一些值,但这样我就找不到 00/00/0000 00:00:00 00 日期的记录。 如何找到这些行?

谢谢!

【问题讨论】:

  • 旧值可能已损坏,like this one。可能没有办法确定值应该是什么。我会调查损坏的值可能来自哪里,以阻止它再次发生。
  • @AlexPoole:谢谢亚历克斯。这是一个有趣的链接。这是一个非常古老的数据库,因此很可能在他们在应用程序中进行一些验证之前就发生了。现在我们将那个 10g Oracle 数据库迁移到 19c,它是从 MS Access 2016 前端调用的,现在我们看到了问题。希望将这些损坏的日期更新为有效的日期将为我们解决此问题。
  • 即使第0年有效,我很好奇00应该如何转换为ampm

标签: sql oracle


【解决方案1】:

我通过玩弄它找到了答案。只是把它放在这里,以便在其他人需要时对其有所帮助。

要查找具有 00/00/0000 00:00:00 00 值的行,此 Where 子句有效:

WHERE TO_CHAR(INVENTORY_DATE,'YYYYMMDDHH24MISS') = '00000000000000'

要查找可能具有更多类似日期值的行:

Select TO_CHAR(INVENTORY_DATE, 'MM/DD/YYYY HH:MI:SS AM') "Inventory Date", MyTable.*
From SOMESCHEMA.INVENTORY MyTable
Where INVENTORY_DATE <  TO_DATE('01/01/1000 01:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM ')
order by MyTable.INVENTORY_DATE ASC NULLS LAST
FETCH FIRST 10 ROWS ONLY;

现在这也会选择日期为 00/00/0000 00:00:00 00 的行。

至于更新,你可以使用这个例子:

UPDATE SOMESCHEMA.INVENTORY
SET INVENTORY_DATE = TO_DATE('12/30/1899 05:00:00 A.M.', 'mm/dd/yyyy hh:mi:ss a.m.', 'nls_date_language=american')
Where INVENTORY_DATE < TO_DATE('01/01/1000 01:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM ');

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2015-07-19
    • 2017-09-21
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多