繁体   English   中英

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

[英]Update date with specific format if value of column is not in same format in Oracle sql

我有一张下面的桌子。 这里的值是字符串,尽管它具有日期值

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或除date以外的任何其他值,应将其忽略

请帮忙。

对不起,我错过了一部分。 格式为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}')

使用正则表达式:

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

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

您可以使用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

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

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

您可能需要手动转换剩余的剩余物,例如2007年12月4日。 您的表中不应包含其他文本,因此请消除任何非日期或null的内容。

编辑:这将以YYYY-MM-DD HH:MM:SS的标准Oracle格式存储日期,在使用to_char(new_date_field,'dd / mm / yyyy')<-或任何格式显示时,您需要重新格式化日期想。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM