【问题标题】:SQL Date and Time in WHERE clauseWHERE 子句中的 SQL 日期和时间
【发布时间】: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


【解决方案1】:

如果你喜欢,你可以用日期算术来做到这一点:

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

我担心要赶在一天的最后一分钟。这表明您可能正在尝试在日期时间上使用 between<=。通常最好避免构造并使用<

【讨论】:

    【解决方案2】:

    你可以使用DATETIMEFROMPARTS:

    DECLARE @t DATE = GETDATE();
    SELECT DATETIMEFROMPARTS(YEAR(@t),MONTH(@t),DAY(@t),23,59,0,0);
    

    DBFidde Demo

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2011-07-13
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多