簡體   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