2017-08-31 98 views
0

如果我從我的Oracle數據庫PL/SQL運行下面的選擇我返回預期的結果:爲什麼TO_DATE需要從Oracle提取數據到水晶報表

select * from risk t where t.accounting_to_date='01-JAN-3000' 

當我運行在相同的SELECT語句水晶報表2016使用命令和Oracle連接,我不能拉任何數據。

我已經找到了解決方法是:

  1. 使用我的水晶報表命令to_date函數是這樣的:

    select * from risk t where t.accounting_to_date= to_date('01-JAN-3000','dd-MON-yyyy')

OR

  • 使用ODBC連接。
  • 這些變通辦法都做的工作。但是,我的問題是:什麼導致這個問題?有什麼地方可以改變嗎?問題在Oracle方面還是在Crystal Reports方面?這是一個錯誤?

    我只是試圖環繞爲什麼發生這種情況我的頭。我必須使用Oracle連接而不是ODBC,因此我無法解決此問題。在Oracle或Crystal中使用to_date在everysingle日期周圍是壓倒性的。我不得不把這個功能添加到幾十個日期,而且還有數百個。

    我偶然發現了這個時候,我們改變了我們的Crystal Reports使用ODBC連接到Oracle連接連接方式。我發現了很多缺失的數據,並且使用to_date函數進行了更正。

    預先感謝您。

    +0

    如果'accounting_to_date'是一個日期,然後比較字符串'01-JAN-3000'涉及的隱式數據轉換。您應該始終使用顯式數據轉換日期。 –

    +0

    如果您確實需要,可以在Oracle中將日期文字指定爲'date'3000-01-31''或更詳細的'to_date()'表達式。 ''01 -JAN-3000''只是一個字符串,你信任當前的默認設置,它會按照你希望的方式轉換。如果某人從具有不同語言設置的桌面運行此操作,該怎麼辦? –

    回答

    1

    一個VARCHAR2的默認鑄造日期只因爲Oracle NLS_DATE_FORMAT配置了默認格式適用於'01 -JAN-2017' 。每個會話都可以更改默認格式,這可能是Crystal Reports每次建立連接時都會執行的操作。

    ,如果你跑了這一點,你會看到什麼樣的默認是:

    SELECT value 
    FROM nls_session_parameters 
    WHERE parameter = 'NLS_DATE_FORMAT' 
    

    如果您補充說,查詢到您的報告不知何故,你可能會能夠看到的格式水晶報表集。

    你可能不應該永遠依靠的默認格式始終工作。如果DBA選擇,DBA可以更改該格式,並且所有依賴它的代碼都會中斷。

    +0

    另一種解決方法是我們在Oracle中創建了一個物化視圖。當我們在Crystal中創建報表並從實例化視圖中拉出時,我們可以看到所有數據。即使視圖中的日期不使用to_date函數。但是,如果我們直接從視圖中解決問題。該字段是一個州代碼(緬因州的ME),爲了獲得該代碼,我們在視圖內調用一個函數。在該函數中,Where子句中有一個日期。如果我們在該日期前未使用to_date函數,則州代碼字段爲空。誰可以給我解釋一下這個? – Leigh

    +0

    您的觀點是否包含where子句? – slambeth

    +0

    自動轉換日期可能在編譯代碼內部工作,因爲它將使用nls_date_format設置,這些設置基於編譯時的當前內容(例如實例化視圖),而不是運行時的設置。底線'01 -JAN-2017'不是日期,它是一個字符串。它有時用作日期的事實是巧合。唯一可以依賴的是使用to_date()。 – slambeth

    -1

    我們在水晶使用Oracle ODBC驅動程序時有同樣的問題,當我們搬到了「CR甲骨文Wire協議ODBC驅動程序」是固定的。既然你需要使用一個oracle連接,我不確定你會做什麼。下面是我們從SAP發現:

    Info from SAP