【发布时间】:2023-03-21 19:45:01
【问题描述】:
我需要在语句的 WHERE 子句中使用今天的日期作为今天的晚上 11:59。例如。如果今天是 2018 年 9 月 4 日,那么我想要 '09/04/2018 23:59'。我尝试了以下方法,但没有成功:
DECLARE @today SMALLDATETIME
SET @today = DATEADD(month, ((YEAR(GETDATE()) - 1900) * 12) + MONTH(GETDATE()) - 1, DAY(GETDATE()) - 1) + ' 23:59:59'
PRINT @today
请指导
【问题讨论】:
-
你为什么想要那个?今天肯定是
date = '2018-09-04 00:00'还是datetime >= '2018-09-04 00:00' AND datetime < '2018-09-05 00:00'? -
在我需要的 WHERE 子句中 - AND @today BETWEEN CONVERT(varchar(10), Startdate, 101) AND ISNULL(StopDate, '06/06/2079')。所以基本上必须考虑到今天下午 23:59 输入的数据。这是业务需求
-
为什么在检查之前将
startdate列转换为字符串?值为startDate = '2018-09-04 01:00', stopDate = '2018-09-04 19:00'的案例呢?该范围涵盖了今天的一部分,但不包括在您建议的 where 子句中。如果您要查找的是range that cover at least part of today,那么更强大的逻辑将是WHERE startDate < '2018-09-05' AND (stopDate IS NULL OR stopDate > '2018-09-04')(注意:我在检查开始日期时使用05- 范围必须在明天开始之前开始,并且在今天开始之后结束。) -
另一个需要注意的注意事项:根据您的数据类型及其精度,如果您有
23:59:59.999的时间,那是今天还是明天发生的? 技术上 使用datetime(而不是datetime2),您的数据不会像那样进入您的数据库,但如果您不使用正确的精度,可能会遇到极端情况。除此之外,你真的不想制造一个刺痛来说明今天的所有情况。只需检查今天小于明天的部分。
标签: sql sql-server-2014 dateadd