如何在日期范围之间查询

How to query between Date Range

我正在查询一个 table,其中返回的时间列格式如下:

2020-12-30 18:26:23.537
2020-12-30 17:43:19.707
2020-12-30 15:36:13.653
2020-12-30 15:35:23.160
2020-12-30 15:23:33.063
2020-12-30 15:22:42.243
2020-12-30 15:18:26.230
2020-12-30 15:15:20.083
2020-12-30 15:13:08.813

当我查询此列的格式时,它显示为日期时间。更新: 使用此查询 returns 日期时间: SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'vStatusMessagesWithStrings' AND COLUMN_NAME = 'TIme'

我曾尝试以多种方式通过 where 语句缩小结果范围,但每次我 运行 我只是得到看起来所有返回的日期,一直追溯到 7 月。

我试过只使用 >= and <=,我也试过使用“Between”,但没有任何效果。 我试过只使用字符串作为 20201228 作为 2020-12-28 和作为 2020/12/30 但没有帮助。 我读到在使用 between 时还需要指定时间,所以我已经尝试将其精确到毫秒,但仍然 returns 一切。我已尝试对日期字符串进行转换和转换,但没有任何效果。

以下是我在 where 语句中尝试过的不同格式的几个示例:

and (sms.[Time] <= (convert(date,'20201228')) and SMS.[TIME] >= (convert(date,'20201222')))
and (sms.[Time] >= '20201222' and  SMS.[Time] <= '20201228')
and ((sms.[Time] >= Cast('20201222' as DateTime)) and  (SMS.[Time] <= Cast('20201228' as DateTime)))
and (sms.[Time] Between Cast('20201222 00:00:00.000' as DateTime) and  Cast('20201228 00:00:00.000' as DateTime))
and (sms.[Time] Between Cast('2020-12-22 00:00:00.000' as DateTime) and  Cast('2020-12-28 00:00:00.000' as DateTime))
and ((sms.[Time] >= Cast('2020-12-22 00:00:00.000' as DateTime)) and sms.[Time] <= Cast('2020-12-28 00:00:00.000' as DateTime))
and ((sms.[Time] >= '2020-12-22' ) and (sms.[Time] <= '2020-12-28'))

一定有其他事情发生,因为你说你试过的每个例子都对我有用,例如

declare @Test table ([time] datetime);

insert into @Test ([Time])
values
('2020-12-21T18:26:23.537'),
('2020-12-22T17:43:19.707'),
('2020-12-23T15:36:13.653'),
('2020-12-24T15:35:23.160'),
('2020-12-25T15:23:33.063'),
('2020-12-26T15:22:42.243'),
('2020-12-27T15:18:26.230'),
('2020-12-28T15:15:20.083'),
('2020-12-29T15:13:08.813');

select *
from @Test sms
where sms.[Time] between cast('2020-12-22T00:00:00.000' as datetime) and cast('2020-12-28T00:00:00.000' as datetime);

Returns:

time
2020-12-22 17:43:19.707
2020-12-23 15:36:13.653
2020-12-24 15:35:23.160
2020-12-25 15:23:33.063
2020-12-26 15:22:42.243
2020-12-27 15:18:26.230

请注意,使用 between 时需要小心,因为它作为 >= 第一限制和 <= 第二限制,可能会产生意想不到的结果。尤其是在这种情况下,你有一个时间组件。

就我个人而言,我总是使用以下模式来确保我得到我要求的确切日期:

select *
from @Test sms
where sms.[Time] >= cast('2020-12-22T00:00:00.000' as datetime) and sms.[Time] < dateadd(day, 1, cast('2020-12-28T00:00:00.000' as datetime));

Returns:

time
2020-12-22 17:43:19.707
2020-12-23 15:36:13.653
2020-12-24 15:35:23.160
2020-12-25 15:23:33.063
2020-12-26 15:22:42.243
2020-12-27 15:18:26.230
2020-12-28 15:15:20.083

您会注意到现在包括 28 号,而之前的查询没有。