2013-02-18 60 views
3

當我寫這篇文章的查詢我想結合日期和時間以及與UTC日期比較

SELECT Convert(datetime,Convert(varchar,CAST(GETUTCDATE() AS DATE))+' '+ 
     CONVERT(varchar, cast(meas_pain.datetime AS time))) FROM meas_pain 

它爲我的作品,但是當我在使用WHERE子句提示錯誤同一部分「轉換轉換日期時失敗和/或來自字符串的時間。'

SELECT schedules.id 
FROM meas_pain LEFT JOIN schedules ON schedules.id=meas_pain.schd_id 
WHERE meas_pain.schd_id=9150 AND 
     Convert(datetime,(Convert(varchar,CAST(GETUTCDATE() AS DATE))+' '+ 
     CONVERT(varchar, cast(meas_pain.datetime AS time)))) < 
     CONVERT(datetime,DATEADD(Minute,0,getutcdate())) 

任何人可以解釋一下?

+1

您所查詢的是很多不必要的轉換。擺脫他們,這將是很容易破解。 – Kaf 2013-02-18 09:42:47

回答

2

我不知道爲什麼這個錯誤不會出現在你的SELECT語句,因爲我可以用重現錯誤只是

SET DATEFORMAT DMY; 
SELECT CONVERT(DATETIME, CONVERT(VARCHAR,CAST(GETUTCDATE() AS DATE))) 

Example of Error

你是依靠本地化的轉換設置你,應該使用明確的轉換,例如

SET DATEFORMAT DMY; 
SELECT CONVERT(DATETIME, CONVERT(VARCHAR, CAST(GETUTCDATE() AS DATE), 111), 111) 

通過明確界定的日期格式都轉換爲varchar,而從varchar(111),就可以避免任何隱含的轉換。

然而,如果您的日期/時間被存儲爲這樣的事應該沒有必要對所有的轉換和從varchar,這是東西出問題只是更多機會,不必要的工作,你可以簡單地添加一個時間到一個日期時間。例如

DECLARE @Date1 DATETIME = DATEADD(HOUR, 1, GETUTCDATE()), 
     @Date2 DATETIME = DATEADD(DAY, 1, GETUTCDATE()); 

SELECT [Date1] = @Date1, 
     [Date2] = @Date2, 
     [Date1/Time2] = CAST(CAST(@Date1 AS DATE) AS DATETIME) + 
          CAST(@Date2 AS TIME); 

從我可以從查詢收集你只是想獲得的結果,其中的meas_pain.datetime的時間小於當前UTC時間,不分日期的。因此,您應該能夠簡化您的查詢,只需:

SELECT schedules.id 
FROM meas_pain 
     LEFT JOIN schedules 
      ON schedules.id = meas_pain.schd_id 
WHERE meas_pain.schd_id = 9150 
AND  CAST(meas_pain.[DateTime] AS TIME) < CAST(GETUTCDATE() AS TIME); 

並刪除進一步的多餘轉換。

Simplified example on SQL Fiddle

ADENDUM

顯然,這個時間比較是不是你以後(雖然它是什麼,你已經發布的查詢正在進行),所以我假設GETUTCDATE()是隻是爲了示範。

您嘗試進行轉換是相同的:

CAST(CAST(GETUTCDATE() AS DATE) AS DATETIME) + CAST(meas_pain.[DateTime] AS TIME) 

Another example on SQL Fiddle using the above conversion

+0

我想比較特定日期的時間只有這將比較所有的時間 – 2013-02-18 09:53:39

+0

感謝這一個爲我工作我不能夠投票給你,因爲我的聲譽很低,非常感謝 – 2013-02-18 10:16:30