1

我需要能够更新表中一行的时间信息。id 不是唯一的,所以我也使用该startTime列来查找特定行。我正在使用 SQL Server CE 和 C#,所以日期对象是DateTimeC# 中的一个对象。

还有其他方法可以优化吗?我似乎无法与该WHERE子句和startTime? startTimedatetimeSQL Server CE 中的一种数据类型。

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')
4

3 回答 3

1

两件事情:

  1. 从一个简单的 SELECT 语句而不是 UPDATE 开始。先让它工作。
  2. 使用日期时间文字。

尝试这个:

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

如果这不起作用,最可能的问题是时间不完全匹配。可能的原因包括:

  • 数据库中的日期时间可能以毫秒精度存储,但您的查询使用的值似乎已四舍五入到最接近的秒数。这可能会导致匹配失败。
  • 数据库中的日期可能已存储在不同的时区。
于 2012-04-14T12:25:14.097 回答
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'

尝试 aSELECT CONVERT(DATETIME, startTime, 121) FROM tablename WHERE id = '14363204'查看您要更新的 startTime 是否有任何毫秒。

于 2012-04-14T12:46:03.840 回答
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 PROCEDUREC# 中并执行存储过程,而不是使用动态 SQL。

我不知道在 SQL CE 中是否可行,但在完整版中,您拥有 SQL Profiler,它使您能够捕获和检查应用程序发送到 SQL Server 的查询。

于 2012-04-14T12:41:51.793 回答