2017-04-19 53 views
0

例如,我有一個學生表,其DOJ(加入日期)列的類型設置爲DATE,因爲我已經以dd-mon-yy格式存儲了記錄。Oracle中的日期比較在哪裏條款

我在運行時有一個IN參數,日期以字符串形式傳遞,並以dd/mm/yyyy格式傳遞。如何比較和獲取日期結果?

我想獲取每個數據庫表學生的DOJ爲25-AUG-92的學生的記錄數,但我在IN參數中以dd/mm/yyyy格式獲取日期爲varchar,請引導。

我試過了多個選項,如truncto_date,to_char但不幸的是,似乎沒有任何工作。

回答

3

我有一個DOJ學生表(加入日期)柱,它的類型,現在設置爲DATE中,我已經存儲在dd-mon-yy格式的記錄。

不完全是,DATE數據類型沒有格式;它作爲7-bytes(年份爲2個字節,月份,日期,小時,分鐘和秒鐘各爲1個字節)內部存儲在表格中。您正在使用的用戶界面(即SQL/PLUS,SQL Developer,Toad等)將處理從其二進制格式到可讀格式的DATE的格式。在SQL/Plus(或SQL Developer)中,此格式基於NLS_DATE_FORMAT session parameter

如果僅使用日,月和年輸入DATE,則時間分量(可能)將被設置爲00:00:00(午夜)。

我有一個IN參數在運行時與日期作爲字符串傳遞或說varchar和它的dd/mm/yyyy格式。如何在日期比較和提取結果?

假定時間部分爲您司法部列始終午夜則:

SELECT COUNT(*) 
FROM students 
WHERE doj = TO_DATE(your_param, 'dd/mm/yyyy') 

如果它並不總是半夜然後:

SELECT COUNT(*) 
FROM students 
WHERE TRUNC(doj) = TO_DATE(your_param, 'dd/mm/yyyy') 

或:

SELECT COUNT(*) 
FROM students 
WHERE doj >= TO_DATE(your_param, 'dd/mm/yyyy') 
AND doj < TO_DATE(your_param, 'dd/mm/yyyy') + INTERVAL '1' DAY 
+0

很好的答案..你可能想補充一點,'TRUNC(doj)'選項會阻止Oracle使用'doj'上的大多數索引,這就是爲什麼你的最後一個選項經常在實踐中看到,儘管它更長並且更復雜。 –

0

以下應該做你所描述的。如果沒有,請提供更多關於「沒有任何工作似乎」的信息。

-- Get the count of students with DOJ = 25-AUG-1992 
SELECT COUNT(1) 
FROM STUDENT 
WHERE TRUNC(DOJ) = TO_DATE('25/AUG/1992','dd/mon/yyyy'); 

以上是從this answer拉。您可能需要查看答案,因爲如果性能對您至關重要,則可以使用不同的方法來編寫不使用trunc的查詢,這將允許Oracle在DOJ上使用索引(如果存在)。

0

雖然我發佈這個有點晚,但我已經能夠重新解決此問題。

我所做的是我轉換了兩個日期to_char在相似的格式,它在這裏工作是我的查詢條件,工作..

TO_CHAR(TO_DATE(C.DOB, 'DD-MON-YY'),'DD-MON-YY')=TO_CHAR(TO_DATE(P_Dob,'DD/MM/YYYY'),'DD-MON-YY')) 

感謝您的支持。 :)