2015-02-23 71 views
0

我有通行證的日期到一個SQL查詢的Crystal報表{日期}?水晶報表 - 甲骨文01861錯誤

當晶體然而使用ODBC連接來連接它更改爲「Oracle服務器」這個工作連接我得到一個錯誤:

ORA-01861: literal does not match format string 

我試圖刪除TO_CHAR或TO_DATE(如在研究這似乎是問題的原因,但無濟於事)

SELECT 
ACTIVE_SEPARATE.WO_NO, 
MCH_TYPE, 
24 * (to_date(to_char(REAL_F_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS') - to_date(to_char(REQUIRED_START_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS')) as BREAKDOWN_HOURS, 
(100 - (((24 * (to_date(to_char(last_day(to_date({?Month}, 'dd-mm-yyyy')),'DD-MM-YYYY'), 'DD-MM-YYYY') - to_date(to_char(trunc(to_date({?Month}, 'dd-mm-yyyy'), 'month'),'DD-MM-YYYY'), 'DD-MM-YYYY'))) + 24) - (24 * (to_date(to_char(REAL_F_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS') - to_date(to_char(REQUIRED_START_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS'))))/((24 * (to_date(to_char(last_day(to_date({?Month}, 'dd-mm-yyyy')),'DD-MM-YYYY'), 'DD-MM-YYYY') - to_date(to_char(trunc(to_date({?Month}, 'dd-mm-yyyy'), 'month'),'DD-MM-YYYY'), 'DD-MM-YYYY'))) + 24)) AS PERCENTAGE_AVAILABILITY 
FROM ACTIVE_SEPARATE 
RIGHT JOIN EQUIPMENT_FUNCTIONAL ON EQUIPMENT_FUNCTIONAL.MCH_CODE = (SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM ACTIVE_SEPARATE ACTIVE_SEPARATE_SUB WHERE ACTIVE_SEPARATE.MCH_CODE = ACTIVE_SEPARATE_SUB.MCH_CODE) 
WHERE ERR_CLASS = '001' 
AND MCH_TYPE IS NOT NULL 
AND (ACTIVE_SEPARATE.REQUIRED_START_DATE BETWEEN 
trunc({?Month}, 'MM') 
AND 
LAST_DAY({?Month})) 

一些本質GR itty是用戶輸入日期(任何日期)。此代碼將採用日期。計算選定月份的總小時數。

它也將通過使完成時間和開始時間相互分離來計算故障時間。

最後它會在本月計算小時數 - 制動時間給我們提供時間。

+0

對這個醜陋的代碼進行故障排除將非常困難。它是否給出錯誤的行號?你能上傳一些樣本數據嗎?我們需要看看它是從什麼開始的,如果我們不得不將日期轉換爲1的值3次。 – mmmmmpie 2015-02-23 13:48:18

+0

沒有行號。我知道代碼醜陋,我正在使用的模式是可怕的。我現在編輯。 – LaLa 2015-02-23 13:52:38

+0

這是一個更大的視圖或查詢的一部分嗎?打破其中的一些片段,並明確運行它們。例如,執行此操作:'從HISTORICAL_SEPARATE中選擇to_char(REAL_F_DATE,'DD-MM-YYYY HH24:MI:SS');'重複此操作直到您運行整個作品。 – mmmmmpie 2015-02-23 13:54:35

回答

1

您在處理您的價值方面存在不一致的問題。在選擇列表中,你正在做的:

to_date({?Month}, 'dd-mm-yyyy') 

如果Crytal短日期作爲字符串類型處理,然後是可行的(雖然用斜槓而不是短橫線是打手),但如果它作爲一個日期處理鍵入,那麼這是對一個字符串進行隱式轉換,然後顯式轉換回日期,這意味着您的NLS設置將發揮作用。

但隨後在where子句中,你只是在做:

BETWEEN trunc({?Month}, 'MM') AND LAST_DAY({?Month})) 

這有相反的情況。如果Crytal短日期被視爲字符串類型,那麼這是對日期進行隱式轉換,這意味着您的NLS設置會再次發揮作用,但如果它被視爲日期類型,那麼這是正常的。

他們不能都是對的,我不熟悉Crystal Reports,所以我不確定發生了哪種轉換。使它們保持一致 - 或者在where子句中添加顯式轉換,或者在選擇列表中刪除它 - 將顯示哪個是問題。我認爲 ORA-01861只能來自to_date(),這意味着where子句是問題。

在SQL Developer中,您的NLS_DATE_FORMAT大概是DD-MM-YYYY,所以隱式轉換仍然「有效」,無論以何種方式發生。但在Crystal Reports中,您有不同的NLS_DATE_FORMAT,導致隱式轉換失敗。