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

时间:2017-11-02 14:59:00

标签: sql oracle

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

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}')

3 个答案:

答案 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')< - 进行显示时需要重新格式化或者你想要的任何格式。