SQL Server-通过给定的日期和时间检查给定的日期和时间是否在两个日期时间变量之间

时间:2018-10-08 13:47:29

标签: sql sql-server datetime

我在数据库表中有两个日期时间列:@Start和@End。

两列都包含日期和时间,例如:

@Start: 2018-10-01 19:00:00
@End: 2018-10-10 23:59:00

考虑到日期和时间,我想知道当前日期是否正好在两个日期时间之间。

因此,2018-10-08 16:372018-10-10 23:59:00会与此范围匹配 而2018-10-11 00:00:00不会。 (在这种情况下,该日期比“​​结束”日期晚一分钟,因此不在我的日期时间范围之内。)

SELECT Id FROM Table1 WHERE GETDATE() BETWEEN Start AND End

我不在真实代码中使用GETDATE(),而是使用一个参数。问题是当前日期参数可能包含秒和毫秒,如23:59:59.123。我的代码将这样的日期视为不符合给定范围。但我不在乎s / ms。

有解决方法吗?

更新:

我想要达到的精度分钟之内。因此,我什至无需考虑秒数或毫秒。我要处理的日期时间格式为“ yyyy-MM-dd hh-mm”,但我不知道如何使用BETWEEN子句将“开始”和“结束”转换为所示格式,以便我可以比较日期。

4 个答案:

答案 0 :(得分:2)

您似乎想要这种逻辑:

WHERE GETDATE() >= Start
  AND GETDATE() < DATEADD(minute, 1, End)

假设End的时间部分为23:59:00,则它涵盖了23:59:0023:59:59.999...999之间的所有可能值。

答案 1 :(得分:1)

从表1中的'2018-10-01 19:00:00'和'2018-10-10 23:59:00'之间的WHERE GETDATE()中选择ID

答案 2 :(得分:1)

尝试

SELECT Id FROM Table1 WHERE 
         CONVERT(varchar(16),GETDATE(),121) BETWEEN 
                  CONVERT(varchar(16),[Start], 121) 
                  AND 
                  CONVERT(varchar(16),[END],121);

不带字符串的舍入示例

DECLARE @GetDateMinutes as datetime2;

DECLARE @X as datetime2 = getdate();

--round to minutes, could be made into a function
SET @GetDateMinutes = dateadd(minute,datepart(minute,@x),dateadd(hour, datepart(hour,@x),cast(CAST(@x as date) as datetime2)))

select @x, @GetDateMinutes

答案 3 :(得分:1)

使用described here技术截断秒数,以避免所有字符串转换,然后进行比较。这是一个完全包含的示例,该示例使用cross applyvalues封装开始和结束的截断逻辑:

-- truncate minutes from current date time
declare @currentDateTime datetime2(0) = DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), N'2018-10-01 23:58:32.912')), 0);

select @currentDateTime as CurrentDateTime
     , a.*
from (values -- create a table of dummy values
    (Convert(datetime2(3), N'2018-10-01 19:48:14.735'), Convert(datetime2(3), N'2018-10-10 02:00:00.000'))
  , (Convert(datetime2(3), N'2018-10-01 22:43:19.532'), Convert(datetime2(3), N'2018-11-01 12:17:26.663'))
) as a (StartDateTime, EndDateTime)
cross apply (values(
    -- truncate minutes from start date time
    DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), a.StartDateTime)), 0)
    -- truncate minutes from end date time
  , DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), a.EndDateTime)), 0)
)) as b (StartDateTimeWithoutSeconds, EndDateTimeWithoutSeconds)
where @currentDateTime between b.StartDateTimeWithoutSeconds and b.EndDateTimeWithoutSeconds;

您的数据似乎已经从开始到结束都截断了s / ms,但想想我将相同的逻辑应用于所有涉及的值,只是为了保持一致。这是去除示例中所有“噪音”的s / ms的公式:

DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), <SomeDateTime>)), 0)