2012-08-10 24 views
-2

我在DB中有兩列:StartDate(日期時間列)和StartTime(nvarchar列)。 StartDate包含事件開始的日期。 StartTime包含事件開始的時間。這是24小時的格式(例如,22:00或12:00)。與nvarchar組合使用datetime

我需要結合StartDateStarTimeWHERE子句中使用它並將結果與​​變量進行比較。它看起來像:

WHERE COMBINED_STARTDATE_WITH_STARTIME >= @DATETIME_VARIABLE 

我使用SQL Server 2008的 這是現有數據庫的設計和不希望改變它。也許,我可以創建第三列,並將datetime + startdate合併到一個列中,但我正在尋找另一個解決方案(不接觸數據庫)。

+0

如果性能是很重要的,你可能希望將日期和時間合併到之前的另一列使用WHERE子句來運行任何查詢。 – StingyJack 2012-08-10 20:10:29

+0

此表上是否有主鍵或標識列? – StingyJack 2012-08-10 20:11:00

+2

請問什麼版本的SQL Server?你爲什麼要單獨存儲這些數據並使用不良數據類型來實現呢? – 2012-08-10 20:24:24

回答

2

您可以使用這樣的事情:

WHERE 
dateadd(minute, cast(right(starttime, 2) as int), 
    dateadd(hour, cast(left(starttime, 2) as int), startdate)) >= @DATETIME_VARIABLE 

SQL Fiddle with DateTime Conversion

在活動開始時間null那麼你可以使用IsNull()圍繞價值:

WHERE 
dateadd(minute, cast(right(isnull(starttime, 0), 2) as int), 
    dateadd(hour, cast(left(isnull(starttime, 0), 2) as int), startdate)) >= @DATETIME_VARIABLE 

SQL Fiddle with Demo

當然,如果你使用SQL Server 2008+你可以施展你的價值隨着時間:

WHERE startdate + IsNull(StartTime, '00:00') >= @DATETIME_VARIABLE 

SQL Fiddle with Demo

+0

如果StartTime列爲空,則這將失敗 - http://sqlfiddle.com/#!3/0eb43/10 – 2012-08-10 20:18:47

+0

@rs:'CASE當StartTime不爲NULL然後... ELSE ... END' – abatishchev 2012-08-10 20:21:35

+0

@rs。編輯以在開始時間周圍包含「IsNull()」 – Taryn 2012-08-10 20:25:53