Oracle-11g-R2

僅在日期中更新年份 (Oracle 11g)

  • November 10, 2016

當我檢查我的一個客戶的數據庫時,我發現了一些會造成問題的錯誤。問題是日期顯示為01-01-01當我嘗試以dd-MM-yyyy結果格式顯示它時01-01-0001。我怎樣才能擺脫這個問題。是否可以在這些日期單獨更新年份。

我可以使用這個查詢找到有這個問題的日期

select from_date from date_table where length(extract(year from from_date))='2';

我可以使用以下邏輯更新它嗎

  • 使用上述查詢查找日期
  • 通過檢查以下條件來更新年份if year is between '00' and '13' prefix '20' with the year else prefix '19'

我怎樣才能做到這一點?我可以使用 Oracle 查詢來做到這一點,還是應該為此編寫程式碼?

數據庫是在 RHEL5 中工作的 Oracle 11g R2。

您可以像這樣向 from_date 添加天數:

UPDATE table_date
SET from_date                              = from_date + 730487
WHERE LENGTH(extract(YEAR FROM from_date)) = '2'
AND from_date                             <= to_date('01/01/0014','dd/mm/yyyy')

UPDATE table_date
SET from_date                              = from_date + 693962
WHERE LENGTH(extract(YEAR FROM from_date)) = '2'
AND from_date                             > to_date('01/01/0014','dd/mm/yyyy')

我建議始終使用適當的數據類型、運算符和函式以及顯式轉換,而不是使用字元串文字、字元串處理和隱式轉換。

看你的說法

select from_date 
from date_table 
where length(extract(year from from_date))='2'
/

長度語句的返回類型顯然是一個數字。那麼為什麼要將它與字元串文字進行比較呢?必須隱式轉換某些東西。將長度函式的數字結果轉換為字元串或將字元串文字'2'轉換為數字。你知道哪一個被轉化了嗎?您知道這種轉換是否會出現任何問題?使用字元串常量而不是數字常量是否有特殊原因?

據我所知,字元串常量將被轉換為數字,我看不出這種轉換有任何問題。我還認為,沒有特殊原因為什麼要使用字元串常量而不是數字常量。但是為什麼要為這些問題煩惱呢?

使用數字文字並寫入

select from_date 
from date_table 
where length(extract(year from from_date))=2
/

我認為您想通過隱式轉換找到從日期到非常早的日期的所有行,因此在 100 年 1 月 1 日之前。那麼為什麼要進行字元串處理呢?使用日期處理和寫入

select from_date 
from date_table 
where from_date<to_date('0100-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/

如果 from_date 列上有索引,則此查詢可能能夠使用該索引。

此查詢還將查找具有 from_date before'0010-01-01 00:00:00'甚至 dates before的行'0000-00-00 00:00:00'。它也可以很容易地調整到其他時間戳。但是,如果您想明確使用年份(並且您確定在 0 BC 之前沒有日期),您可以

select from_date 
from date_table 
where extract(year from from_date) between 0 and 99
/

如果 from_date 列上有索引,則此查詢可能無法使用該索引。

將 2000 年添加到日期可以通過添加來完成INTERVAL '2000' YEAR(4)

UPDATE table_date
SET from_date  = from_date+INTERVAL '2000' YEAR(4)
WHERE to_date <to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/


UPDATE table_date
SET from_date  = from_date+INTERVAL '1900' YEAR(4)
WHERE to_date >=to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/

因為您通過插入以字元串表示的日期的行開始進行字元串處理,所以您也可以使用字元串處理進行更正。如果您在插入行時沒有使用時間部分,您可以/應該HH24:MI:SS在以下語句中省略格式部分

UPDATE table_date
SET from_date  = to_date('20'||substring(to_char(from_date,'YYYY-MM-DD HH24:MI:SS'),2),'YYYY-MM-DD HH24:MI:SS')
WHERE to_date <to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/


UPDATE table_date
SET from_date  = to_date('19'||substring(to_char(from_date,'YYYY-MM-DD HH24:MI:SS'),2),'YYYY-MM-DD HH24:MI:SS')
WHERE to_date >=to_date('0014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
/

引用自:https://dba.stackexchange.com/questions/48575