2012-05-10 150 views
3

我有一個比較2個表中的日期,但問題是一個表的日期是DD-Mon-YY格式,另一個表格是YYYYMM格式的日期。從DD-Mon-YY到YYYYMM的Oracle SQL轉換日期格式

我需要使它們都是YYYYMM來進行比較。

我需要創造這樣的:

SELECT * FROM offers 
WHERE offer_date = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') 
AND offer_rate > 0 

其中CREATE_DATE是像12月 - 2006年和offer_date是像200605

,我需要去適應這個查詢任何想法?

+1

爲什麼你有問題? offer_date是一個'VARCHAR2'(字符串)? – Phil

+0

日期沒有這種格式。如果你想要這種格式,你需要定義一個字符串。所以,你在尋找字符串(有格式)還是DATETIME(沒有格式)。所以,如果你的領域「有不同的格式」,他們的實際數據類型是什麼? DATETIMEs,VHARCHAR()等? – MatBailie

+0

@phil - offer_date是一個NUMBER字段 – Tom

回答

2

由於offer_date是一個數,比你的真實日期精度較低,這可能工作...
- 轉換你的真實日期格式的字符串YYYYMM
- 該值CONVER爲INT
- 比較的結果您在offer_date

SELECT 
    * 
FROM 
    offers 
WHERE 
    offer_date = (SELECT CAST(to_char(create_date, 'YYYYMM') AS INT) FROM customers where id = '12345678') 
AND offer_rate > 0 

此外,通過做所有的操作上create_date您只能對一個值進行處理。

此外,如果您操作了offer_date,您將無法利用該字段上的任何索引,因此強制使用SCAN而不使用SEEK。

1

我錯過了什麼嗎?你可以只是轉換offer_date的比較:

SELECT * 
FROM offers 
WHERE to_char(offer_date, 'YYYYMM') = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') AND 
     offer_rate > 0 
+0

我認爲你在解決方案附近的某個地方。它會幫助我說create_date是DATE格式,offer_date是NUMBER格式(這真的不是所有有用的!) – Tom

+0

'WHERE to_char(offer_date,'YYYYMM')=(SELECT to_char(create_date,'YYYYMM') FR ...'做了這些技巧......感謝我指引我朝着正確的方向 – Tom

+2

@Tom:注意;在'to_char()'中包裝'offer_date'會混淆該字段上的任何索引,相反,你可以做'create_date'上的所有處理,因爲您只需要爲此查詢執行一次操作,然後使用索引來查找'offer_date'上的索引查找。* [對標量常量執行操作,幾乎無限優於操作數據正在搜索。] * – MatBailie