2012-04-14 105 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',看看是否有您要更新的开始时间任何毫秒。