2012-07-25 108 views
5

我有以下程序界面:錯誤轉換數據類型爲nvarchar爲datetime

Create procedure [dbo].[InsertItemDetails] 
    @TimeItemAdded datetime 

當我打電話這樣說:

EXEC [dbo].[InsertItemDetails] 
    @TimeItemAdded = N'20/07/2012 00:00:00'; 

我得到這個錯誤:

Msg 8114, Level 16, State 5
Error converting data type nvarchar to datetime.

+0

你傳遞給在'InsertItemDetails'了''@TimeItemAdded參數什麼價值? – LittleBobbyTables 2012-07-25 14:08:25

+0

20/07/2012 00:00:00作爲日期和時間 – 2012-07-25 14:08:51

回答

10

根據您的區域設置,您傳入@TimeItemAdded的參數可能無法識別。

您應該通過日期爲:

20120720 
+0

歡呼,問題解決了,我會在9分鐘內接受它 – 2012-07-25 14:10:53

+2

這不是一種安全格式。 'SET LANGUAGE FRENCH; SELECT CONVERT(DATETIME,'2012-07-20 00:00:00');'yield'Msg 242,Level 16,State 3,Line 2; La conversion d'un type dedonnéesvarchar en type dedonnéesdatetime acrééune valeur hors limites.' datetime的安全格式是'YYYYMMDD'或'YYYY-MM-DDTHH:MM:SS.nnn' - 'T'很重要。 – 2012-07-25 14:12:05

+0

@AaronBertrand - 迷人;刪除時間的一致性 – LittleBobbyTables 2012-07-25 14:12:37

2

使用一個明確的字符串字面量爲你的約會。在這種情況下:

EXEC dbo.InsertItemDetails 
    ... 
    , @TimeItemAdded = '20120720'; 

更好的是,確保在您知道日期正確的情況下傳遞強類型參數。理想情況下,這絕不應該以任何格式呈現爲字符串。

區域格式,如M/d/y是壞消息,因爲你不能保證他們將工作給用戶的會話,日期格式,語言設置,機器上的區域設置等

0

這鏈接具有所有日期時間格式,它們的內容 http://www.sql-server-helper.com/tips/date-formats.aspx

您可以將它作爲varchar傳遞並使用適當的日期格式代碼將其顯式轉換爲日期時間。例如:

SELECT CONVERT(DATETIME, '20/07/2012 00:00:00', 103) 

103是您正在查找的日期時間碼。

+1

我不同意你應該將參數更改爲varchar。儘可能早地修復格式(或使用正確的數據類型)。如果將參數更改爲varchar,則可以傳入任何他們想要的內容。例如,「mm/dd/yyyy」會中斷; '06/07/2012'將默默存儲錯誤的日期,'07/20/2012'會產生異常。 – 2012-07-25 14:29:21

0

SQL讀您的日期7/20/2012這是無效的,你可以用更安全的格式yyyy-MM-dd例如,通過你的約會對象:2012-07-20

相關問題