WHERE子句中的SQL日期和时间

WHERE子句中的SQL日期和时间,sql,sql-server-2014,dateadd,Sql,Sql Server 2014,Dateadd,我需要在语句的WHERE子句中使用今天的日期作为今天的日期的晚上11:59。例如,如果今天是2018年4月9日,那么我想要“2018年4月9日23:59”。我尝试了以下方法,但没有成功: DECLARE @today SMALLDATETIME SET @today = DATEADD(month, ((YEAR(GETDATE()) - 1900) * 12) + MONTH(GETDATE()) - 1, DAY(GETDATE()) - 1) + ' 23:59:59' PRINT @

我需要在语句的WHERE子句中使用今天的日期作为今天的日期的晚上11:59。例如,如果今天是2018年4月9日,那么我想要“2018年4月9日23:59”。我尝试了以下方法,但没有成功:

DECLARE @today SMALLDATETIME

SET @today = DATEADD(month, ((YEAR(GETDATE()) - 1900) * 12) + MONTH(GETDATE()) - 1, DAY(GETDATE()) - 1) + ' 23:59:59'

PRINT @today
请指导您可以使用:

您可以使用:


如果您愿意,您可以使用日期算术:

SET @today = dateadd(minute, -1, cast(dateadd(day, 1, cast(getdate() as date)) as smalldatetime));

我担心的是如何争取一天的最后一分钟。这表明您可能正在尝试在或
之间使用
,如果您愿意,可以使用日期算术:

SET @today = dateadd(minute, -1, cast(dateadd(day, 1, cast(getdate() as date)) as smalldatetime));

我担心的是如何争取一天的最后一分钟。这表明您可能试图在
之间使用
,或者
为什么要这样做?当然,今天不是
date='2018-09-04 00:00'
就是
datetime>='2018-09-04 00:00'和datetime<'2018-09-05 00:00'
?在我的WHERE子句中,我需要-和@today之间转换(varchar(10),Startdate,101)和ISNULL(StopDate,'06/06/2079')。所以基本上今天晚上23:59之前输入的数据必须考虑在内。这就是业务需求为什么在检查
startdate
列之前要将其转换为字符串?值为“2018-09-04 01:00”,停止日期为“2018-09-04 19:00”的案例如何处理?该范围包括今天的一部分,但不包括在建议的where条款中。如果您所寻找的
范围至少覆盖了今天的一部分
,那么更可靠的逻辑应该是
,其中startDate<'2018-09-05'和(stopDate为NULL或stopDate>'2018-09-04')
(注意:我在检查开始日期时使用的是
05
——范围必须在明天开始之前开始,并在今天开始之后结束。)另一个需要注意的事项是:根据您的数据类型及其精度,如果您的时间为
23:59:59.999
,这是今天还是明天发生的?从技术上讲是
datetime
(而不是
datetime2
)你的数据不会像那样进入你的数据库,但是如果你没有使用正确的精度,边缘案例可以帮助你。除此之外,你真的不想建立一个统计今天所有时间的统计。只需检查今天少于明天的部分。你为什么要这样做?当然今天是
日期='2018-09-04 00:00'
或者在我的WHERE子句中,它是
datetime>='2018-09-04 00:00'和datetime<'2018-09-05 00:00'
?在CONVERT(varchar(10),Startdate,101)和ISNULL(StopDate,'06/06/2079'之间。因此,基本上必须考虑到今天晚上23:59之前输入的数据。这是业务要求。为什么在检查之前要将
startdate
列转换为字符串?对于值为
startdate='2018-09-04 01:00',stopDate='2018-09-04 19:00'
的情况如何?该范围包括今天的一部分,但不包括在内根据您建议的where子句。如果您要查找的
范围至少涵盖当前的一部分
,则更可靠的逻辑应该是
其中startDate<'2018-09-05'和(stopDate为NULL或stopDate>'2018-09-04')
(注意:我在检查开始日期时使用的是
05
——范围必须在明天开始之前开始,并在今天开始之后结束。)另一个需要注意的事项是:根据您的数据类型及其精度,如果您的时间为
23:59:59.999
,这是今天还是明天发生的?从技术上讲是
datetime
(而不是
datetime2
)你的数据不会像那样进入你的数据库,但是如果你没有使用正确的精度,边缘案例可以帮助你。除此之外,你并不真的想建立一个可以解释今天所有情况的sting。只需检查今天比明天少的部分。