2012-01-25 60 views
1

我不解的說出來了昨天的藍色我的生產服務器上的錯誤。 我做一個LINQ2SQL查詢,如:日期時間轉換停止工作

var mis = from m in dtcx.valori 

        join p in dtcx.TEPARAMs on m.PARAMCD equals p.PARAMCD 
        where 

        blah blah blah 

        select new 
        { 
         dataRilevazione = m.dataRilevazione, 
         id =m.data>=new DateTime(2010,02,26)&&m.X==3&&m.Y==69?100: m.id, 

         blah blha 
        }; 

此轉換成具有條件的SQL查詢:

N'SELECT [t0].[dataRilevazione], 
    (CASE 
     WHEN ([t0].[data] >= @p6) AND ([t0].[X] = @p7) AND ([t0].[Y] = @p8) THEN @p9 

@p6='2010-02-26 00:00:00'

這就像一個魅力的工作很長一段時間,因爲兩天前它停止工作時說,從varchar到datetime的轉換有錯誤。

爲事實上的問題是2010-02-26 00:00:00是沒有更多的轉換爲日期!如果我嘗試

打印

convert(datetime,'2010-02-26 00:00:00' ) 

我得到了同樣的錯誤,這消失使用

convert(datetime,'2010-02-26 00:00:00', datetime) 

,因爲當所有的工作,我沒有改變用戶,還是其語言環境,也沒有任何東西,我我知道。

我能做些什麼? 感謝

UPDATE: 剖析SQL Server中,LINQ 2 SQL似乎設置正確的語言:

-- network protocol: TCP/IP 
set quoted_identifier on 
set arithabort off 
set numeric_roundabort off 
set ansi_warnings on 
set ansi_padding on 
set ansi_nulls on 
set concat_null_yields_null on 
set cursor_close_on_commit off 
set implicit_transactions off 
set language us_english 
set dateformat mdy 
set datefirst 7 
set transaction isolation level read committed 

所以語言設置爲美國英語!爲什麼轉換仍然失敗超出了我! 每一個想法是讚賞...

+1

什麼'SELECT @@ LANGUAGE'返回?在SQL Server的'CONVERT('2010-02-26 00:00:00',datetime)中,這也是(這可能是你的拼寫錯誤)'總是會出錯,因爲這在語法上是不合適的。您需要交換數據類型和值(即'CONVERT(datetime,'2010-02-26 00:00:00')')。 –

+0

您是否將p6參數設置爲日期時間,如DECLARE @ p6 datetime? –

+0

chris,我的排字錯誤 el ninho,因爲它是由linq2sql – pomarc

回答

2

你不會說什麼語言環境,因爲這很重要 - 你說它沒有改變,但我會對這個假設保持謹慎:-)有一點需要關注的是,美國和英國的日期時間格式被區別對待當「反」格式:

  • 英國現場看到日期yyyy-dd-mm hh:mm:ss.fff
  • US區域看到日期yyyy-mm-dd hh:mm:ss.fff

您可以查看您當前做使用的語言/區域設置SELECT @@LANGUAGE

例如,這將引發一個錯誤:

SET LANGUAGE british 
GO 
SELECT CAST ('1999-01-21 10:11:12.345' AS DATETIME) 
GO 

但是如果你改變了區域設置爲美國英語,它會正確解析。

如果你想保證它總是會被解析爲yyyy-mm-dd,那麼你需要嚴格並通過在日期和時間之間指定T來使用完整的ISO規範,例如:1999-01-21T10:11:12.345將以相同的方式解析兩個地區。

另一個有趣的'陷阱'要警惕處理日期/時間數據。

旁註:不,我不知道爲什麼微軟認爲我們在Blighty的權利pondians看到日期爲yyyy-dd-mm ...我從來沒有遇到過這種格式。可以從歐洲格式繼承?

+0

Ouch生成的,所以我無法控制SQL端!在時間和日期之間不是Z,而是T,Z - 它在時間和時區之間! 8-) –

+1

Doh!塔:-)修正。相信記憶並快速打出答案...... –

+0

是的,現在它的+1 –

0

看到不同的結果:

SET LANGUAGE English 
SELECT convert(DATETIME, '2010-02-01 00:00:00') 
SET LANGUAGE French 
SELECT convert(DATETIME, '2010-02-01 00:00:00') 
SET LANGUAGE Italian 
SELECT convert(DATETIME, '2010-02-01 00:00:00') 

結果是:

2010-02-01 00:00:00.000 
2010-01-02 00:00:00.000 
2010-01-02 00:00:00.000 

而且,如在使用new DateTime(2010,02,26)與法國,你的榜樣意大利或類似的語言可能導致此錯誤

使用DBCC USEROPTIONS檢查會話選項 - 語言選項尤其是