如果列的值在 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 中的格式不同,则使用特定格式更新日期的主要内容,如果未能解决你的问题,请参考以下文章