数据库毫秒比较出错,急!!!

wangwolue 2004-10-13 04:06:09



表table_test_log的结构:

ID Tab_Record_Id Action_Type Action_Time
==========================================================
1 1111 add 2004-09-30 10:47:04.327
2 .. delete 2004-09-30 10:47:04.543

其中 Action_Time为datetime 类型

发现

SELECT Tab_Record_Id, Action_Type, CONVERT(char(30), Action_Time, 21) AS Action_Time
FROM dbo.table_test_log
WHERE (DATEDIFF(ms, Action_Time, CONVERT(DATETIME, '2004-09-30 10:47:04.321', 21)) < 0)
ORDER BY Action_Time

可以把 ID 为 1 的那条记录查出来,而

SELECT Tab_Record_Id, Action_Type, CONVERT(char(30), Action_Time, 21) AS Action_Time
FROM dbo.table_test_log
WHERE (DATEDIFF(ms, Action_Time, CONVERT(DATETIME, '2004-09-30 10:47:04.326', 21)) < 0)
ORDER BY Action_Time

查不出来.













...全文
88 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangwolue 2004-10-13
  • 打赏
  • 举报
回复
多谢 zjcxc(邹建)!!!
zjcxc 2004-10-13
  • 打赏
  • 举报
回复
'2004-09-30 10:47:04.321' --因为精确度为百分之三秒,所以会转换成:2004-09-30 10:47:04.320

'2004-09-30 10:47:04.326' --按上面的转换规则,326会调整成327
zjcxc 2004-10-13
  • 打赏
  • 举报
回复
再看联机帮助上的说明,就容易理解了

datetime

从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据
精确度为百分之三秒(等于 3.33 毫秒或 0.00333 秒)。
如下表所示,把值调整到 .000、.003、或 .007 秒的增量。
zjcxc 2004-10-13
  • 打赏
  • 举报
回复
select CONVERT(DATETIME, '2004-09-30 10:47:04.326',21)

--结果: 2004-09-30 10:47:04.327

就是这个原因导致
wangwolue 2004-10-13
  • 打赏
  • 举报
回复
我不转换也查不出来
mgsray 2004-10-13
  • 打赏
  • 举报
回复
我这里可以检测出id为2的记录
select CONVERT(DATETIME, '2004-09-30 10:47:04.326', 21)
结果是2004-09-30 10:47:04.327
所以没有id为1的记录
victorycyz 2004-10-13
  • 打赏
  • 举报
回复

这样写就可以了:

SELECT Tab_Record_Id, Action_Type, Action_Time
FROM dbo.table_test_log
WHERE (DATEDIFF(ms, Action_Time, '2004-09-30 10:47:04.326') < 0)
ORDER BY Action_Time



select CONVERT(DATETIME, '2004-09-30 10:47:04.326', 21)
转换后有误差:


2004-09-30 10:47:04.327

(所影响的行数为 1 行)

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧