SQL SERVER时间查询语句要求精确到时分

我想实现一个SQL SERVER 的查询语句,要求精确到时分,例如,表名是:FKY_YUYUE

为什么下面的写法不正确的呢?

SELECT *
FROM FKY_YUYUE
WHERE  CONVERT(char(16),GETDATE(),21)<='2023-08-08 12:58'

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确
你的查询语句有一个小错误,需要进行一些修正。在 SQL Server 中,要比较日期时间时,确保你使用的日期格式是正确的,并且最好使用合适的数据类型进行比较。在你的情况下,你可以使用以下方法来实现你的需求:

SELECT *
FROM FKY_YUYUE
WHERE CONVERT(char(16), GETDATE(), 21) <= '2023-08-08 12:58'

这将返回表 FKY_YUYUE 中在 '2023-08-08 12:58' 之前的所有记录。


然而,如果你想要比较到时分,最好的方法是使用 datetimedatetime2 数据类型,而不是将日期时间转换为字符并进行比较。以下是更好的写法:

SELECT *
FROM FKY_YUYUE
WHERE GETDATE() <= '2023-08-08 12:58:00'

这个查询会返回表中在 '2023-08-08 12:58:00' 之前的所有记录。


需要注意的是,如果你想要包括 '2023-08-08 12:58:00' 这一时刻的记录,可以使用 < 操作符,而不是 <= 操作符:

SELECT *
FROM FKY_YUYUE
WHERE GETDATE() < '2023-08-08 12:59:00'

这将返回表中在 '2023-08-08 12:58:00' 之前,但不包括 '2023-08-08 12:59:00' 的所有记录。


该回答引用NewBing,仅供参考,不保证完全正确

您的写法不正确的原因可能是您使用了 CONVERT 函数来将 GETDATE() 的返回值转换为 char(16) 类型,而这个类型的格式是 yyyy-mm-dd hh:mm ,没有秒部分。因此,当您用这个值和字符串 '2023-08-08 12:58' 比较时,实际上是比较了 '2023-08-08 12:58:00' 和 '2023-08-08 12:58' ,这两个值是不相等的,所以 WHERE 条件不成立。


如果您想要精确到时分的查询语句,有几种可能的方法:

  • 使用 DATETIMEFROMPARTS 函数来构造一个 datetime 类型的值,然后和 GETDATE() 比较。例如:
SELECT *
FROM FKY_YUYUE
WHERE GETDATE() <= DATETIMEFROMPARTS(2023, 8, 8, 12, 58, 0, 0)
  • 使用 DATEPART 函数来提取 GETDATE() 的年、月、日、时、分部分,然后和指定的值比较。例如:
SELECT *
FROM FKY_YUYUE
WHERE DATEPART(YEAR, GETDATE()) <= 2023
AND DATEPART(MONTH, GETDATE()) <= 8
AND DATEPART(DAY, GETDATE()) <= 8
AND DATEPART(HOUR, GETDATE()) <= 12
AND DATEPART(MINUTE, GETDATE()) <= 58
  • 使用 CAST 或 CONVERT 函数将 GETDATE() 的返回值转换为 datetime2(0) 类型,这个类型的格式是 yyyy-mm-dd hh:mm:ss ,有秒部分,但是精度为 0 。然后和一个同样格式的字符串比较。例如:
SELECT *
FROM FKY_YUYUE
WHERE CAST(GETDATE() AS datetime2(0)) <= '2023-08-08 12:58:00'

以上方法都可以实现您想要的效果,您可以根据您的喜好和需求选择其中一种。如果您想了解更多关于 SQL SERVER 的日期和时间数据类型和函数的信息,您可以参考以下链接⁴ 。


源: 与必应的对话, 2023/8/8
(1) datetime (Transact-SQL) - SQL Server | Microsoft Learn. https://learn.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver16.
(2) 日期和时间数据类型及函数 - SQL Server (Transact-SQL) | Microsoft Learn. https://learn.microsoft.com/zh-cn/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-ver16.
(3) SQL中日期类型比较(精确到时分秒) - CSDN博客. https://blog.csdn.net/badarker/article/details/109307320.

因为字符串比较是基于字符的比较,而不是基于日期和时间的比较,你可以尝试这样:


SELECT *
FROM FKY_YUYUE
WHERE CAST(GETDATE() AS datetime) <= '2023-08-08 12:58'

【以下回答由 GPT 生成】

上述写法不正确的原因是,使用GETDATE()函数获取的当前时间是包含秒的,而将其转换为char(16)后会丢失秒的信息,导致比较不准确。

正确的写法应该是使用CONVERT函数将日期时间转换为特定的格式,包含时分信息。例如,可以使用下面的写法来查询精确到时分的数据:

SELECT *
FROM FKY_YUYUE
WHERE CONVERT(char(16), FKY_YUYUE.[date_column], 120) <= '2023-08-08 12:58'

其中,[date_column]是表中存储日期时间的列名,120是CONVERT函数的格式参数,代表将日期时间转换为yyyy-mm-dd hh:mi的格式。

优化建议: 1. 为日期时间列添加索引:如果该表的数据比较大,且频繁进行时分精确的查询,可以考虑为日期时间列添加索引,以提高查询的性能。 2. 使用参数化查询:为了提高查询的性能和安全性,可以将查询语句改为参数化查询,避免每次查询都重新解析和编译SQL语句。 3. 根据实际需求使用合适的索引类型:根据实际数据和查询情况,选择适当的索引类型,例如聚集索引、非聚集索引或覆盖索引等,以提高查询的效率。 4. 注意数据库服务器的时区设置:如果数据库服务器的时区与查询时的时区不一致,可能会导致精确到时分的查询结果不准确。可以确保数据库服务器的时区设置正确,或者在查询语句中明确指定时区信息。 5. 定期维护和优化数据库:定期进行数据库的维护和优化操作,例如重新建立索引、清理无用数据等,以提高整体性能和查询效率。 6. 进一步优化查询语句:根据具体的业务需求和数据量大小,进一步优化查询语句,例如使用JOIN来优化查询关联表的性能、使用子查询优化复杂的条件过滤等。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^