如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期

Posted

技术标签:

【中文标题】如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期【英文标题】:Update date with specific format if value of column is not in same format in Oracle sql 【发布时间】:2017-11-02 14:58:59 【问题描述】:

我有一张如下表。这里的值是字符串,虽然它有日期值

id  date_value
1   28-JUL-17
2   20/10/17
3   21-09-2017
4   04-AUG-2017
5   (null)
6   xxxx

现在,只有当日期不是 dd-MON-yy 格式时,我才需要更新 date_value 列的值。此外,该列中的值可以是 null 或除日期以外的任何其他值,应忽略

请帮忙。

对不起,我错过了一部分。 dd-MM-yy 格式的值应更新为 dd-MON-yy。

所以到现在我都试过了

update table_a set value = to_char(to_date(date_value, 'dd-MM-yy'), 'dd-MON-yy')
where date_value is not null
and date_value not like '%/%/%'
and date_value != 'xxxx'

我收到 SQL 错误:ORA-01858 - “在应为数字的地方发现了一个非数字字符”

我可以使用下面的查询来解决这个问题

update table_a set value = to_char(to_date(date_value, 'dd/MM/yyyy'), 'dd-MON-yy') 
where regexp_like (date_value, '[0-9]2/[0-9]2/[0-9]4')

【问题讨论】:

您想将匹配的行更新到哪些值?另外,为什么要将日期信息存储为文本? 到目前为止你尝试过什么?我可以为你写一个查询,但在我看到你正在尝试的查询之前,我不太确定它是否是你想要的。 【参考方案1】:

使用正则表达式:

update t
   set date = . . .
   where not regexp_like(date, '[0-9]2-[A-Z]3-[0-9]2');

这会检查整体格式。如果您想要特定月份:

update t
   set date = . . .
   where not regexp_like(date, '[0-9]2-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-[0-9]2');

. . . 是您要使用的新值。

【讨论】:

【参考方案2】:

您可以使用 CASE 语句。

类似这样的事情:

UPDATE table_name   
SET date_value=   CASE  
                        WHEN (date_value LIKE '%-%')  THEN TO_DATE(date_value)   
                        WHEN (date_value LIKE '%/%')  THEN TO_DATE(REPLACE(date_value,'/','-'))
                        ELSE NULL 
                        END 

看到这个帖子: https://***.com/a/5171127/7613110

和文档: https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm

【讨论】:

【参考方案3】:

我认为您需要在表中创建第二列,该列是日期格式并允许为空。然后使用 Oracle 的 to_date 函数将您的列转换为日期格式的新列。

问题是您必须指定当前日期格式才能使用 to_date,因此您需要一些额外的 SQL 来确定当前格式是什么,即如果前两个位置 > 12 那么应该是 dd /mm/yy 格式,因此您将使用 to_date(date_value,'dd/mm/yy')。

您可能需要手动转换剩余部分,例如 12/04/07。您的表格中不应包含杂项文本,因此请消除任何不是日期或空值的内容。

编辑:这将以 YYYY-MM-DD HH:MM:SS 的标准 Oracle 格式存储日期,使用 to_char(new_date_field,'dd/mm/yyyy')

【讨论】:

以上是关于如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期的主要内容,如果未能解决你的问题,请参考以下文章

用于计算同一列的值百分比的 SQL [关闭]

SQL CHECK 约束

如果特定值在行内,则更改行中的背景颜色

在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?

基于变化表中的值在插入之前触发 PL/SQL 触发器

PL/SQL 动态插入