如何在日期范围之间查询
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 号,而之前的查询没有。
我正在查询一个 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 号,而之前的查询没有。