僅在日期中更新年份 (Oracle 11g)
當我檢查我的一個客戶的數據庫時,我發現了一些會造成問題的錯誤。問題是日期顯示為
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') /