2013-10-21 49 views
1

我們有一箇舊表格,其中日期字段以多種格式存儲在VARCHAR2中。現在我們計劃:將VARCHAR2轉換爲日期,然後再將其轉換爲特定的日期格式

1)將這些數據存儲在具有適當日期字段的視圖中。

2)同樣以MM/DD/YYYY等單一一致的格式存儲它們。

這裏是爲#1完成:創建一個函數,以便它可以解析VARCHAR2並將其轉換成一個日期爲不同的格式,如:

IF dataTobeConverted IS NOT NULL 
     THEN 
      IF substr(dataTobeConverted,3,1) = '-' 
      THEN retDate:= TO_DATE(dataTobeConverted,'DD-MON-YYYY'); 
      END IF; 

      IF substr(dataTobeConverted,3,1) = '/' 
      THEN retDate:= TO_DATE(dataTobeConverted,'MM/DD/YYYY'); 
      END IF; 
     END IF; 

RETURN retDate; 

#2,我們還是要轉換這兩個日期以上的MM/DD/YYYY,一個已經在這種格式,所以我們需要在第一個條件轉換另一個('DD-MON-YYYY')如果條件存儲在MM/DD/YYYY視圖的日期領域。所以現在我們需要將日期轉換爲日期(從一種格式轉換爲另一種格式並返回日期)

在此先感謝!

回答

0

如果我正確地理解了你,你不需要再次轉換它 - 如果你將一串字符轉換爲DATE數據類型,那麼它的存儲方式是一樣的,不管原始日期如何,例如,VARCHAR2數據類型,看起來像。

將數據呈現給用戶的方式取決於您使用的會話參數或模型格式,例如TO_CHAR函數。但是,在內部,DATE存儲沒有格式模型。

1

存放在視圖

查看這些數據不存儲實際的數據 - 它只是一個存儲select聲明,僅此而已。

第一如果要被存儲在MM/DD/YYYY在視圖的日期字段條件

當轉換一個字符串,使用特定的格式,它表示日期到DATE數據類型的值,它並不意味着Oracle以該格式存儲轉換後的值。提供格式掩碼作爲TO_DATE()函數的第二個參數,您只需通知oracle爲DATE數據類型的值提供適當的內部表示形式。日期不會以任何特定格式存儲。 這意味着,一旦您將字符串文字轉換爲DATE數據類型的值,您只需使用to_char()函數以任何格式顯示該日期,而您希望或依賴的日期表示格式掩碼爲nls_date_format

SQL> with t1(col) as(
    2 select to_date('21-10-2013', 'dd-mm-yyyy') from dual union all 
    3 select to_date('21/10/2013', 'dd/mm/yyyy') from dual union all 
    4 select to_date('21.10.2013', 'dd.mm.yyyy') from dual 
    5 ) 
    6 select to_char(col, 'dd/mm/yyyy') as res 
    7 from t1 
    8 ; 


RES 
---------- 
21/10/2013 
21/10/2013 
21/10/2013 
0

由於Przemyslaw Kruglej正確地評論,你不應該在一個varchar2中存儲日期。這個說:

 
alter table oldtable add new_date date; 

update oldtable set new_date = 
    case 
    when substr(old_date,3,1) = '-' then to_date(old_date,'DD-MON-YYYY') 
    when substr(old_date,3,1) = '/' then to_date(old_date,'MM/DD/YYYY') 
    else null 
    end 
where old_date is not null; 

檢查每一個日期被認定:

select * from oldtable where old_date is not null and new_date is null; 

最後:

alter table oldtable drop old_date; 
0

也許你可以這樣做以下:

UPDATE myTable 
    SET newDateColumn = CASE 
          WHEN substr(oldDateColumn,3,1) = '-' 
          THEN TO_DATE (oldDateColumn, 'DD-MON-YYYY') 
          WHEN substr(oldDateColumn,3,1) = '/' 
          THEN TO_DATE (oldDateColumn, 'MM/DD/YYYY') 
          WHEN substr(oldDateColumn,3,1) = '.' 
          THEN TO_DATE (oldDateColumn, 'DD.MM.YYYY') 
          ELSE TO_DATE (oldDateColumn) 
         END; 

這會將VARCHAR2列轉換爲DATE co如果您已經創建了該列,請將這些值存儲到新列中。

或者,在你看來,只寫select語句如下:

SELECT ... 
     CASE 
      WHEN substr(oldDateColumn,3,1) = '-' 
      THEN TO_DATE (oldDateColumn, 'DD-MON-YYYY') 
      WHEN substr(oldDateColumn,3,1) = '/' 
      THEN TO_DATE (oldDateColumn, 'MM/DD/YYYY') 
      WHEN substr(oldDateColumn,3,1) = '.' 
      THEN TO_DATE (oldDateColumn, 'DD.MM.YYYY') 
      ELSE TO_DATE (oldDateColumn) 
     END AS column_alias 
    FROM ... 
WHERE ... 

可以任意選擇最適合您的業務需求,但如果我是你,我肯定會選擇存儲的第一個選項將數據放在不同的列中,然後刪除舊的列。