2015-08-25 39 views
0

一列(txn_issue_dt)是char和issue_dt是日期,我試圖比較兩者,但是我自學成功,我很難過,請幫助。查詢中的字符值和日期值比較

SELECT ptf.carrid, 
     ptf.cov_effdt, 
     ptf.cvg_id, 
     ptf.err_msg, 
     ptf.error_id, 
     ptf.fine_dt, 
     ptf.fine_id, 
     ptf.fine_status, 
     ptf.polnbr, 
     ptf.txn_code, 
     ptf.txn_type, 
     ptf.rcvd_dt 
FROM policy_tracking_fine_view ptf 
     INNER JOIN canc_rein cr ON cr.polnbr = ptf.polnbr 
WHERE ptf.txn_code = '05' 
AND ptf.fine_type = 'L' 
AND ptf.fine_status_descrip NOT IN ('SUSPENDED', 'VOID') 
AND TO_CHAR (ptf.txn_issue_dt, 'yy-mon-dd') = TO_DATE (cr.issue_dt, 'mm/dd/yy'); 

我收到ORA-01481:無效的數字格式模型 和ORA-01861:文字不匹配格式字符串

+0

嘗試: '和TO_DATE(ptf.txn_issue_dt,'yy-mon-dd')= cr.issue_dt' –

回答

0

你的字符轉換爲字符(txt_issue_dt)和日期到一個約會。總是轉換爲相同的數據類型,所以如果你有不同的數據類型,保持一樣的並轉換其他數據類型。 你的情況:

TO_DATE(ptf.txn_issue_dt, '')= cr.issue_dt

因此,如果txn_issue_dt的內容是一樣的東西2015年-APR-01,把 'YYYY-MON-DD'作爲比較左側的格式掩碼。

請記住,圍繞列名放置函數會禁用該表的索引使用。因此,在我的示例中,sql解釋器不使用txn_issue_dt上的索引。

1

當您比較兩個日期時,最好是兩者都在DATE數據類型中。

如果這兩列已經在DATE數據類型中,那麼您不必擔心轉換它們(儘管您可能需要擔心是否需要將TRUNC()日期設置爲日期/月份/年/小時等);您可以將它們作爲日期進行比較。

如果一個或多個列是一個字符串,那麼您將不得不將其轉換爲DATE數據類型,您可以使用TO_DATE執行該操作。

所以,在您的查詢,它看起來像你需要改變

AND TO_CHAR (ptf.txn_issue_dt, 'yy-mon-dd') = TO_DATE (cr.issue_dt, 'mm/dd/yy')

AND TO_DATE (ptf.txn_issue_dt, 'yy-mon-dd') = cr.issue_dt

顯然,你的日期作爲一種字符串列的格式決定了你使用的格式掩碼。它看起來像你的數據有兩位數的年份? (Ick,ick,ick,ick!就像Y2K從來沒有發生過......)如果是這樣,那麼使用'rr-mon-dd'的格式掩碼可能會更好,以便更好地猜測今年的前兩位數字是。

例如,如果你的字符串日期看起來像'23/08/2015'那麼你會這樣做TO_DATE(ptf.txn_issue_dt, 'dd/mm/yyyy')

注意。 從不對已經是DATE數據類型的東西做TO_DATE();您已經介紹了潛在的錯誤,甲骨文將不得不做這依賴於默認NLS_DATE_FORMAT參數幕後的隱式轉換,這可能導致錯誤或返回不正確的日期:

alter session set nls_date_format = 'dd/mm/yy hh24:mi:ss'; 

select to_char(to_date(sysdate, 'dd/mm/yyyy hh24:mi:ss'), 'dd/mm/yyyy hh24:mi:ss') dt from dual; 

DT     
------------------- 
25/08/0015 12:25:20