2015-11-18 80 views
1

以下SQL,時間範圍報告

:P_COMP_DATE_FROM = '15 -nov-2015' :P_COMP_DATE_TO = '15 -nov-2015'

作爲比較之間'15 -nov-2015 00:00:00' 和'15 -nov-2015 00:00:00'

Select Ordered_date 
From xxcost_rep 
Where DATE_COMPLETED BETWEEN NVL(fnd_date.canonical_to_date(:P_COMP_DATE_FROM), DATE_COMPLETED) AND NVL(fnd_date.canonical_to_date(:P_COMP_DATE_TO)), DATE_COMPLETED); 

我怎麼能比較這爲當日的日和結束的開始,所以能在範圍內顯示正確的結果。

我想下面的添加86399秒使它的一天結束,但收到錯誤:

WHERE DATE_COMPLETED BETWEEN NVL(fnd_date.canonical_to_date(:P_COMP_DATE_FROM), DATE_COMPLETED) AND NVL(fnd_date.canonical_to_date(to_date(:P_COMP_DATE_TO,'DD-MON-YYYY')+interval '86399' second), DATE_COMPLETED) 

{P_TO_CUSTOMER=, P_COMP_DATE_FROM=2015/11/15 00:00:00, P_COMP_DATE_TO=2015/11/15 00:00:00, P_TO_ORDER_NUMBER=, P_CUST_REGION=, P_TO_DATE=, P_JOB_STATUS=, P_FROM_DATE=, P_FROM_ORDER_NUMBER=, P_FROM_CUSTOMER=} Calling XDO Data Engine... --SQLException java.sql.SQLDataException: ORA-01861: literal does not match format string

+0

郵編。錯誤是由於您取決於您​​的本地** NLS **日期格式,這與您使用的日期格式不同。您必須始終明確提供**格式掩碼**。 –

+0

不要將日期作爲字符串傳遞。使用適當的'日期'變量。然後,您也不需要使用自己的函數將字符串轉換爲日期的解決方法。 –

回答

1

ORA-01861: literal does not match format string

上述錯誤是因爲日期文字不與格式掩碼匹配。

例如,

SQL> SELECT TO_DATE('2015118','yyyy/mm/dd') FROM dual; 
SELECT TO_DATE('2015118','yyyy/mm/dd') FROM dual 
       * 
ERROR at line 1: 
ORA-01861: literal does not match format string 

你可能會存儲日期爲字符串,則可能是不同的日期格式的字符串。因此,您的功能fnd_date.canonical_to_date可能會失敗的日期文字,同時轉換爲日期使用TO_DATE

另外,您不應該依賴於您的客戶端的NLS日期格式。請記住,TO_DATE是依賴於NLS的。您應該明確提及格式掩碼

例如,

SQL> SELECT to_date('11/18/2015 00:00:00', 'mm/dd/yyyy hh24:mi:ss') date_from, 
    2   to_date('11/18/2015 23:59:59', 'mm/dd/yyyy hh24:mi:ss') date_to 
    3 FROM dual; 

DATE_FROM   DATE_TO 
------------------- ------------------- 
11/18/2015 00:00:00 11/18/2015 23:59:59 

在你的情況,你需要比較的日期。你可以不喜歡它下面的例子中,

SQL> WITH DATA AS(
    2 SELECT DATE '2015-11-18' dt FROM dual 
    3 ) 
    4 SELECT * FROM DATA 
    5 WHERE dt 
    6 BETWEEN to_date(
    7     to_char(dt, 'mm/dd/yyyy')||' 00:00:00', 
    8     'mm/dd/yyyy hh24:mi:ss' 
    9    ) 
10 AND  to_date(
11     to_char(dt, 'mm/dd/yyyy')||' 23:59:59', 
12     'mm/dd/yyyy hh24:mi:ss' 
13    ); 

DT 
------------------- 
11/18/2015 00:00:00 

UPDATE

對於您只需要啓動時間的第一部分,你不必時間部分添加爲00:00:00日期既有日期和時間元素。如果您未提及時間部分,則默認爲午夜00:00:00

例如,添加INTERVAL '86399' SECOND:fnd_date.canonical_to_date`的`

SQL> SELECT DATE '2015-11-18' from_date, 
    2   DATE '2015-11-18' + INTERVAL '86399' SECOND to_date 
    3 FROM dual; 

FROM_DATE   TO_DATE 
------------------- ------------------- 
11/18/2015 00:00:00 11/18/2015 23:59:59 
+0

刪除了fnd_date.canonical_to_date函數。現在+間隔'86399'秒正在爲一個參數工作,但不能爲另一個工作。 –

+0

不工作不是oracle標準錯誤。您需要編輯您的問題併發布錯誤。爲什麼它會爲一個參數而不是另一個參數工作?比較看看有什麼不同。對於其他參數,爲什麼你甚至需要添加一個間隔?您需要在時間00:00:00開始,因此保留日期部分,其時間部分爲00:00:00。 –

+0

添加了更新。請將答案標記爲已接受,也會幫助其他人! –