2013-01-24 61 views
0

運行包含日期的存儲過程作爲輸入時出現錯誤。odbc_exec datetime error

我的查詢是:

$query = "asistencia_virtual '2012-01-01', '2012-12-31'"; 

在Management Studio中,它完美的作品。

我只有問題的查詢已過時,其他工作很好。

Warning: odbc_exec(): SQL error: [Microsoft][SQL Server Native Client 10.0][SQL Server]
Error de sintaxis al convertir una cadena de caracteres a datetime., SQL state 22008 in SQLExecDirect

+0

你使用的是什麼版本的sql server? –

+0

@JW。 SQL Server Native Client 10.0 - 即2008年 – twoleggedhorse

回答

0

試試這個(reference)

asistencia_virtual {d'2012-01-01'}, {d'2012-12-31'} 
+0

謝謝{d'2012-12-31'}修復它! – Jaime

0

當涉及到日期,最好的做法是給予書面替代一個月 - 這樣就沒有機會,一天,一個月可以沿途混合起來。嘗試輸入的日期作爲字符串的格式如下:

'DD MMM YYYY'

$query = "asistencia_virtual '01 Jan 2012', '31 Dec 2012'"; 
+1

將不會工作,如果針對國際客戶 – cha

+0

它總是工作,西班牙語你會使用烯(enero)而不是jan如果sql server設置爲西班牙語 – twoleggedhorse

+1

問題是你可以有兩個用戶在同一個應用程序中,一個用西班牙語,一個用英語。您是否真的想要根據語言對某些月份名稱進行硬編碼切換? –

2

正如你已經找到了,yyyy-mm-dd不是一個安全的日期格式。這是爲什麼:

SET LANGUAGE FRENCH; 
SELECT MONTH(CONVERT(DATETIME, '2012-01-12')); -- yields 12, not 1 
GO 
SELECT CONVERT(DATETIME, '2012-12-31'); 

第一查詢產生12,而不是1,因爲它將此解釋爲yyyy-dd-mm。第二個查詢得到:

Msg 242, Level 16, State 3, Line 1
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.

唯一安全的格式,迄今爲止,只有時間字符串字面量是yyyymmdd。這裏是你的代碼應該是什麼樣子(加入強制性EXECdbo.前綴):上常見的日期/時間查詢問題

$query = "EXEC dbo.asistencia_virtual '20120101', '20121231';"; 

對於更多的信息:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx

+0

雖然我永遠不會懷疑你,那怎麼不理智呢?是不是ISO 8601日期規格?這不會被歸類爲解析引擎的失敗,而不是「本地化」問題?這是一個失敗......我甚至都不明白。我很高興你在博客文章中列入了連接問題。希望這在不久的將來會消失。 – jcolebrand

+0

@jcolebrand這與堅持本地化有關。據稱,當有人表示他們的語言是'FRENCH'時,SQL Server團隊(當時的情況)認爲這意味着他們需要'yyyy-dd-mm'。我不會試圖將ISO標準拉得太遠,因爲大多數客戶不知道或不關心 - 99%的客戶使用「mm/dd/yyyy」或「dd/mm/yyyy」。 .. –

相關問題