2012-04-14 196 views
1

我需要能夠更新表中某一行的時間信息。該ID不是唯一的,因此我也使用startTime列來查找特定行。我正在使用SQL Server CE和C#,因此日期對象是C#中的DateTime對象。SQL Server CE:在Where子句中使用DateTime更新語句

有沒有另一種方法來優化呢?我似乎無法與WHERE條款和startTime匹配? startTime是SQL Server CE中的datetime數據類型。

UPDATE tablename 
SET endTime = '14/04/2012 9:42:58 PM', duration = '0.052003' 
WHERE (startTime = CONVERT(DATETIME, '2012-04-14 21:42:58.000', 120)) AND (id= '14363204') 

回答

1

兩件事情:

  1. 開始只是一個簡單的SELECT語句,而不是更新。先做好工作。
  2. 使用日期時間文字。

試試這個:

SELECT * 
FROM tablename 
WHERE startTime = '2012-04-14 21:42:58.000' AND id = '14363204' 

如果這不起作用,最有可能的問題是,時間是不完全匹配。可能的原因可能包括:

  • 數據庫中的日期時間可能以毫秒級的精度存儲,但您的查詢使用的值似乎已經四捨五入到最接近的秒。這可能導致匹配失敗。
  • 數據庫中的日期可能已存儲在不同的時區中。
+0

時間肯定不匹配。在數據庫中記錄爲'14/04/2012 8:51:00 PM'。當我嘗試匹配相同或甚至'2012-04-14 20:51:00.000'時,不會在select語句中顯示任何結果。我需要爲數據庫的精確度做些特別的事嗎? – Ourx 2012-04-14 12:36:51

+0

@Ourx:時間可能以毫秒精度存儲,但毫秒可能不會顯示。除非您可以確定您始終使用相同的時區和精度,否則將時間戳用作ID(或作爲ID)通常是一個糟糕的主意。 – 2012-04-14 12:52:59

0

爲什麼CONVERT(DATETIME, '2012-04-14 21:42:58.000', 120)?你是否將你的startTime作爲字符串傳遞?這可能是一個問題。 startTime.ToString()(在C#中)可能會產生超出預期的格式?你是否使用動態SQL(意思是:你在C#中以字符串的形式建立查詢,然後將其開啓)?

分解您的查詢並檢查傳遞的參數。

DECLARE @startTime DATETIME = '2012-04-14 21:42:58.000' 
DECLARE @endTime DATETIME = '14/04/2012 9:42:58 PM' 
DECLARE @duration DECIMAL = 0.052003 
DECLARE @id INT = 14363204 

-- debug - check if your input parameters are as expected 
SELECT @startTime AS startTime, @endTime AS endTime, @duration AS duration 

-- do the update 
UPDATE tablename 
SET endTime = @endTime, duration = @duration 
WHERE startTime = @startTime AND id = @id 

我建議你來包裝成以上,並CREATE PROCEDURE從C#執行存儲過程並沒有使用動態SQL。

我不知道在SQL CE中是否可能,但是在完整版中,您有SQL Profiler,可以捕獲和檢查由您的應用程序發送到SQL Server的查詢。

0

您正在使用120日期樣式轉換您的時間,該日期樣式剝離了毫秒。如果startTime值是使用GETDATE()生成的,則不會匹配。

無論何時處理SQL日期(樣式121),我都建議堅持採用ISO-8601日期格式,因爲它不需要CONVERT()調用,更重要的是它不是區域設置 - (例如,你的代碼會在法語或德語的SQL Server上失敗)。

UPDATE tablename 
SET endTime = '20120414 21:42:58', duration = '0.052003' 
WHERE startTime = '20120414 21:42:58.000' AND id = '14363204' 

嘗試SELECT CONVERT(DATETIME, startTime, 121) FROM tablename WHERE id = '14363204',看看是否有您要更新的開始時間任何毫秒。