【问题标题】:How to query between Date Range如何在日期范围之间进行查询
【发布时间】:2021-04-07 07:22:17
【问题描述】:

我正在查询一个表,其时间列按以下格式返回:

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

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

我尝试通过多种方式通过 where 语句来缩小结果范围,但每次运行它时,我都会看到所有返回的日期,一直到 7 月。

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

以下是我在 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'))

【问题讨论】:

  • 你有什么问题?你的例子看起来很合理。
  • and 之前的内容是什么? where 子句中是否有or
  • ^^^^ 那是实际答案:) 很好发现
  • 很高兴你得到它。下次发布整个代码:-)

标签: sql sql-server date tsql between


【解决方案1】:

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

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);

返回:

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,因为它作为&gt;= 第一个限制和&lt;= 第二个限制工作,可能会产生意想不到的结果。尤其是在这种情况下,您是否有时间组件。

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

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));

返回:

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 个,而之前的查询没有。

【讨论】:

  • 如果您使用的是datetime,我个人建议使用yyyy-MM-ddThh:mm:ss.nnn。如果您不是美国人,SQL Server 会对值的含义做出一些奇怪的选择。
  • @DaleK 我在插入我从查询结果中提取的一些日期后尝试了您显示的内容,是的,它确实有效。会发生什么?如果是UTC时间会有所不同吗?我需要先转换列吗?
  • 我使用这个查询来检查列是什么数据类型。我也将它添加到原始帖子中 SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'vStatusMessagesWithStrings' AND COLUMN_NAME = 'TIme' DATA_TYPE datetime
  • ? 你说得对,我喝醉了。我在上面看了我的 or 声明。我把它放在括号中,现在得到正确的范围。
  • 谢谢@Dalek,我没有添加整个查询,因为我的案例陈述需要多长时间,但我想我可以删除这些。
猜你喜欢
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多