2010-11-04 208 views
2

我遇到了將一個表中的VARCHAR轉換爲DATETIME,然後在比較中使用它的問題。格式('2010-09-02 10:38:31.000')在所有記錄上似乎都是正確的,我可以毫無問題地選擇數據。但是,如果我嘗試在WHERE子句中使用新的日期時間,則會出現以下錯誤:從字符串轉換日期和/或時間時轉換失敗。SQL Server 2008將varchar轉換爲datetime

所以僅僅是明確的,這個工程:

SELECT Field1, Field2, CAST(Field3 AS DATETIME) AS DateTaken FROM MyTable; 

返回所有預期的數據,有沒有空日期。以下失敗與前面提到的錯誤。

SELECT Field1, Field2 FROM MyTable WHERE CAST(Field3 AS DATETIME) > @startDate; 

我嘗試使用視圖來檢索數據,但它有相同的錯誤。接下來,我嘗試爲數據創建一個臨時表,如下所示...

SELECT Field1, Field2, CAST(Field3 AS DATETIME) AS Field3 INTO _MyTable; 
SELECT Field1, Field2 FROM _MyTable WHERE Field3 > @startDate; 

哪一個能夠成功。

我所有的搜索只是導致格式不正確的日期和/或區域設置,導致havok在我的情況下似乎不是原因。每次我需要使用DATETIME轉換時,我寧願不創建表,所以我在這裏做錯了什麼?非常感謝幫助!

+1

什麼是@startDate變量的數據類型的特定日期格式?你有什麼價值? – 2010-11-04 02:46:45

+0

在最終版本中,它也會從VARCHAR中轉換,但爲了將CAST作爲變量消除,我使用GETDATE() – 2010-11-04 02:58:31

+0

爲什麼不只是傳入日期時間並避免投射? – clyc 2010-11-04 03:01:52

回答

1

編輯#3 ..............

select * from test 
    where case isdate(field3) when 1 
     then CAST(field3 as datetime) else null end > @startdate 

編輯#2 ..............

我做了我的分貝測試...

declare @startdate datetime 

select @startdate = '09/1/2010' 

Create table test (field1 varchar(50), field2 varchar(50), field3 varchar(50)) 


insert into test 
select 'test' as field1, 'test' as field2, '2010-09-02 10:38:31.000' as field3 

insert into test 
select 'test2' as field1, 'test2' as field2, '2010-09-02 10:38:31.000' as field3 

insert into test 
select 'test3' as field1, 'test3' as field2, '2010-10-02 10:38:31.000' as field3 

select * from test where CAST(field3 as datetime) > @startdate 

select * from test where Convert(datetime, field3) > @startdate 

drop table test 

結果:

test test 2010-09-02 10:38:31.000 
test2 test2 2010-09-02 10:38:31.000 
test3 test3 2010-10-02 10:38:31.000 


test test 2010-09-02 10:38:31.000 
test2 test2 2010-09-02 10:38:31.000 
test3 test3 2010-10-02 10:38:31.000 

改變STARTDATE面值時至2010年10月1日 結果:

test3 test3 2010-10-02 10:38:31.000 

test3 test3 2010-10-02 10:38:31.000 

1日響應................. 你嘗試轉換?

SELECT Field1, Field2 FROM MyTable WHERE CONVERT(DateTime, Field3) > @startdate; 
+0

使用CONVERT(DATETIME,Field3,121)的同樣的問題。使用它時,SELECT會產生結果,但在WHERE子句中使用時會導致錯誤。 – 2010-11-04 02:45:17

+0

CONVERT與CAST相同 - 或者用於顯式數據類型轉換 – 2010-11-04 02:46:09

+0

@clyc:是的 - 我不明白它 – 2010-11-04 02:56:22

0

爲了驗證問題是否與數據不符(通常是這個錯誤),請嘗試執行以下語句。如果你輸出了一些行,那麼這些數據很可能是錯誤的原因。

 select * from myTable where isdate(FIELD3)=0 
+0

返回0行。 – 2010-11-04 03:22:35

0

考慮強制使用SET DATEFORMAT ymd

相關問題