where 子句中的日期时间条件无法正常工作

Posted

技术标签:

【中文标题】where 子句中的日期时间条件无法正常工作【英文标题】:DateTime condition in where clause doesnt work correctly 【发布时间】:2021-12-16 18:53:06 【问题描述】:

我的表中有第一列日期时间类型的行:

2021-11-01 08:51:56.123 102 296 

当我使用下面的选择命令时,我得到相同的结果(这一行):

select * from  cmd where timestamp = convert(datetime, '2021-11-01 08:51:56.122')
select * from  cmd where timestamp = convert(datetime, '2021-11-01 08:51:56.123')
select * from  cmd where timestamp = convert(datetime, '2021-11-01 08:51:56.124')

我要求只有第二个命令选择这一行。

怎么做?

SQL Server 是版本 14

【问题讨论】:

datetime 并不那么精确。如果你真的想要这样的精度,你应该使用datetime2。你想做什么?为什么要微秒精度?无论精度如何,您都无法确保时间戳是唯一的。 【参考方案1】:

DATETIME 的精度为(大约)0.003 秒。这意味着它只能表示每 3 千分之一秒,其他所有内容四舍五入到 0.000、0.003 或 0.007 秒的增量,如下表所示。

User-specified value    System stored value
01/01/98 23:59:59.999   1998-01-02 00:00:00.000
01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998   1998-01-01 23:59:59.997
01/01/98 23:59:59.992

01/01/98 23:59:59.993

01/01/98 23:59:59.994   1998-01-01 23:59:59.993
01/01/98 23:59:59.990

01/01/98 23:59:59.991   1998-01-01 23:59:59.990

您可以使用DATETIME2(3) 代替DATETIME 以获得更高的精度。

更多详情请阅读https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15

【讨论】:

看起来你是对的。我尝试使用 datetime 作为从 PLC 更新的记录的唯一标识符,因为 PLC 没有 bigint(8 个字节)只有 int(4 个字节),但我想我必须使用 int 作为 PK 并在一段时间后重置它时间。感谢您的回复。 @jakkar 您还有其他几个选项可以识别数据库中的记录,几乎所有这些选项都可以表示为字符串或数字,并且受到许多其他语言的支持。例如,您可以查看UNIQUEIDENTIFIER,它可以在 SQL Server 中轻松转换为二进制或字符串值,然后可以在任何其他系统中使用。

以上是关于where 子句中的日期时间条件无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

日期字段上的左连接 + Where 子句

在 where 子句问题中的 Oracle 日期比较

where 子句中的日期时间

查询 eloquent where 子句中的所有值

如果需要运算符的 where 子句中的条件

带有日期字符串的 Android SQLite rawquery 在 WHERE 子句中不起作用