2011-11-18 71 views
0

我有兩個表的實體 - 說Valid_Doc和Invalid_Doc。如果文檔有效,則將所有數據保存在Valid_Doc表中。如果文檔的任何屬性均無效,則將其保存在兩個表的列的Invalid_Doc.Due_Date中。在Invalid_Doc中,我們正在保存字符串爲的日期無效。允許搜索無效的日期存儲爲字符串 - 是否建議

假設如果通過搜索屏幕文檔用戶搜索與以下日期

DUE_DATE - 是後 - 07/07/11, 咱們都顯示無論從tables.As DUE_DATE在Invalid_Doc文件表是字符串,我們無法將輸入的搜索日期與Invalid_Doc表中的數據庫中可用的日期進行比較。

是否有人可以指導我是否使用DATEDIFF - 即需要在數據庫字符串日期轉換爲日期(的毫秒)第一,然後做與進入data.Doing這一點,有可能是不可預測的結果進行比較。那麼,我們是否允許用戶通過Date或NOT搜索無效的文檔。

Select * FROM invalid_doc iil WITH (nolock) WHERE 
CAST(Datediff(s, '19700101 05:00:00:000', iil.due_date) AS NUMERIC) * 
    1000 
    BETWEEN '1120501800000' AND '1120501800000' 

其中'1120501800000'和'1120501800000'是以毫秒爲單位的日期轉換。

請建議。

+1

我認爲你的主要問題是首先將字符串轉換爲日期時間。那麼請指定你的意思是無效日期?你應該拆分數據,並嘗試使用dd/mm/yyyy字符串將其轉換爲真正的日期格式,然後在聯合加入兩個表並進行全部比較後。 – YvesR

+0

對不起,我出來了,因爲我通過上傳一個xml文件來填充數據庫數據。因此,用戶可以輸入任何日期值,沒有驗證,例如, 100/100/100東西。您是否建議爲無效日期提供搜索功能?或者是否需要添加檢查,如果日期無效,請插入NULL – C4CodeE4Exe

回答

0

我繼續回答:) 因爲我不知道您的語言,所以您處理xml數據我強烈建議您驗證您的日期,然後插入數據庫。 無法在數據時間字段中輸入無效的數據值。

如果您有類似11/24/2011的數據並插入它,則datetime值始終會自動添加時間。 然後你有例如。 11/24/20011 17:29:00 000存儲值。

如果您插入的日期少於某個日期,則可能會崩潰,或者如果該值可以轉換爲有效日期,那麼缺少的部分將被「當前日期信息」替換。

所以實際上你必須驗證你的字符串,將其轉換。事情是這樣的:

-- @datestring <= somehow your string from xml 
SET arithabort arith_overflow OFF 
SET @date = CAST(@datestring AS DATETIME) 
IF @date is NULL SET @date = GETDATE() 
SET arithabort arith_overflow ON 

你把溢出錯誤模式關閉,嘗試轉換,如果失敗設置默認。

或者在MS SQL

IF (ISDATE(@date_string) = 0) SET @date = GETDATE() 

希望這有助於

4

我會使用正則表達式(如Q20011231Q)轉換的日期在數據庫中,以一個統一的字符串格式,也是查詢轉換爲相同搜索前的格式。 這樣你就可以控制你的數據,並且可以很容易地進行比較