2013-04-26 17 views
1

我正在編寫一個使用Oracle數據庫進行存儲的Java軟件。我可以最好地將它描述爲一種審計跟蹤(?),記錄我的測試受衆做了什麼,在什麼日期和什麼電腦上。這些都是手動輸入,所以人們手動輸入這些信息,然後將其保存到數據庫中,然後由管理員查看。Oracle中是否有一個函數/ SQL查詢過濾數據,如果它可以轉換爲DateTime?

這裏的SQL語句我使用的檢索數據:

SELECT fld 1 as EmpNumber, 
fld2 as EmpName, 
fld6 as Date 
FROM tblReportTemp 
LEFT JOIN tblPersonalInfo b ON $P{hrStoreOp}= b.ID_PERSONAL 
WHERE computerName = $P{COMPNAME} 
ORDER BY fld6,fld2 asc 

我的隊友決定讓所有領域的VARCHAR類型,然後決定讓用戶在Date類型,而不是,使用日期選擇器。因此,很多測試用戶,懶惰的測試用戶,只需簡單地輸入最容易達到的內容,例如Q或1,甚至空間。所以首先,它不會按日期正確安排,其次,在排列它之前,我通過TO_DATE(fld6,'MM/dd/yy')將數據轉換爲日期的嘗試遭遇失敗,因爲它無法將'Q'轉換爲日期。

我已經用日期選擇器替換了文本框,但是,我們不允許修改數據庫。

所以我建議的解決方案是修改上面的SQL語句以過濾那些無法轉換爲日期的。是否有Oracle的SQL查詢可以執行此操作?

謝謝。

+0

我個人的建議總是使用控件,如日期選擇器,它可以防止用戶輸入無效日期,並且減少檢查工作是否是日期等等。 – 2013-04-26 03:28:25

+0

如果你使用日期選擇器,你可以使用日期選擇器想要,但最好的防禦方法是讓該列成爲「DATE」類型。日期選擇器將處理具有日期選擇器的頁面上輸入的日期,但這不是將日期值存入數據庫的唯一方法。 – 2013-04-26 03:31:33

+0

是的,我已經修改了模塊的這一部分。用戶從現在開始輸入的每件東西都是日期。但是,正如我所說的,根據我們的教師指示,數據庫不能修改,因爲「在現實世界中,您不能修改公司的數據庫等等。」我們必須忍受我們的錯誤並想辦法解決它。 – 2013-04-26 03:38:12

回答

1

您可以使用一個函數來進行轉換,並丟棄壞的數據爲NULL:

CREATE OR REPLACE FUNCTION my_to_date(p_date_string IN VARCHAR2) RETURNS DATE 
IS 
BEGIN 
    RETURN TO_DATE(p_date_string, 'MM/DD/YY'); 
EXCEPTION WHEN OTHERS THEN 
    RETURN NULL; 
END; 

創建使用後:

SELECT some_column 
    , my_to_date(my_date_string_column) as real_date 
FROM some_table 
WHERE ... 

而且,你真的應該數據類型更改爲DATE並強制用戶只輸入有效日期。根據你問題中的列名看起來你的同事試圖對所有東西都使用通用的「彈性域」。這通常是一個非常糟糕的主意,除非你真的打算將任意類型的數據存儲在同一行(這通常也是一個壞主意)。

+0

感謝你的回答。對不起,花了很長時間回來。 – 2013-04-30 04:17:34

1

首先,拍一張varchar2專欄中關於存儲日期頭部的隊友。

其次,編寫一個PL/SQL Pipelined Function來過濾掉非日期行。我不認爲有一個簡單的方法可以用簡單的SQL來做到這一點。

基本上,流水線函數允許您對一個或多個數據集執行編程操作,並將自定義的PL/SQL集合對象返回爲錶行。這些功能則能夠在SELECT語句中使用:

SELECT col1, col2, col3, ... 
FROM TABLE(my_pipelined_function(param1, param2, param3, ...)) 

上這些功能(包括例如代碼)的進一步細節可以發現here

+1

Steven - 我認爲流水線功能可能會在這裏矯枉過正。像ConvertIdiotTeammateDate(string)這樣的UDF可以正常工作,特別是因爲這只是一項任務。然後@zack_falcon可以從查詢中調用該函數。該函數可以嘗試轉換爲日期,並且如果它有效,則返回日期或者如果它返回null。另外,我認爲拍拍對隊友來說太好了:) – 2013-04-26 03:50:18

相關問題