我有一张如下表格。这里的值是字符串,虽然它有日期值
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}')
答案 0 :(得分:0)
使用正则表达式:
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}');
. . .
用于您要使用的新值。
答案 1 :(得分:0)
您可以使用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://stackoverflow.com/a/5171127/7613110
和文件: https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm
答案 2 :(得分:0)
我认为您需要在表中创建第二列,即日期格式并允许为null。然后使用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')< - 进行显示时需要重新格式化或者你想要的任何格式。