SQL Server 中的 Datetime BETWEEN 语句无法正常工作

22

我有以下查询:

SELECT * FROM LOGS 
WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18')

这个查询没有返回任何结果,但是以下查询返回了结果,

SELECT * FROM LOGS WHERE CHECK_IN >= CONVERT(datetime,'2013-10-17')

为什么第一个查询没有返回任何结果?如果我犯了错误,请纠正我。


你能发布从 LOGS 表中选择前 5 条 CHECK_IN 大于等于 '2013-10-17' 的结果吗? - kgu87
6个回答

55

你的日期是否带有时间信息?BETWEEN(在...之间)是包含边界的,但是当你将2013-10-18转换为日期时,它会变成2013-10-18 00:00:000.00。除非你包括一个时间值,否则在18号的第一秒之后记录的任何内容都不会在BETWEEN中显示。

尝试:

SELECT 
* 
FROM LOGS 
WHERE CHECK_IN BETWEEN 
    CONVERT(datetime,'2013-10-17') 
    AND CONVERT(datetime,'2013-10-18 23:59:59:998')

如果您想搜索第18天的整个日期。我将毫秒设置为998,因为SQL Server在查询中提取了2013-10-19 00:00:00:0000。

SQL DATETIME字段有毫秒。所以我向该字段添加了999。


我尝试了这种方法,但它一直指责语法错误,即使对于这个确切的查询也会告诉它有语法错误。可以使用以下链接进行复现:https://es.rakko.tools/tools/36/ - intmarinoreturn0
rakko.tools看起来像是一个MySQL网站 - 我会检查MySQL相关的问题。https://dev59.com/R2865IYBdhLWcg3wa980 看起来似乎可以帮助你找到所需的语法。 - Skerkles

6

第二条查询语句返回了17号和18号的结果吗?还是只返回了18号的结果?

第一条查询语句仅返回17号或18日午夜之前的结果。

请尝试使用以下查询语句。

select * 
from LOGS 
where check_in >= CONVERT(datetime,'2013-10-17') 
and check_in< CONVERT(datetime,'2013-10-19')

5

2

你的两个查询都没有错误。

我猜想可能是以下原因之一:

  • 2013-10-17和2013-10-18之间没有任何记录
  • 第二个查询返回的记录都在2013-10-18之后

0
DROP TABLE  IF EXISTS #TB_PERIODO_TEMP CREATE TABLE #TB_PERIODO_TEMP (DATA DATETIME)
INSERT INTO #TB_PERIODO_TEMP VALUES
('22-12-2022 00:00:00'),
('22-12-2022 23:59:59'),
('23-12-2022 00:00:00'),
('23-12-2022 23:59:59')

SELECT * FROM #TB_PERIODO_TEMP -- ALL

SELECT * FROM #TB_PERIODO_TEMP WHERE DATA 
    BETWEEN '22-12-2022' AND '23-12-2022' --OLÉ!!!

--BETWEEN CONSIDERING PERIODS WITH HOURS O/
SELECT * FROM #TB_PERIODO_TEMP WHERE DATA 
    BETWEEN '22-12-2022' AND '23-12-2022 23:59:59:999'

enter image description here


0

您需要将日期字段转换为varchar类型以去除时间,然后再将其转换回datetime类型,这将重置时间为“00:00:00.000”。

SELECT *
FROM [TableName]
WHERE
    (
        convert(datetime,convert(varchar,GETDATE(),1)) 

        between 

        convert(datetime,convert(varchar,[StartDate],1)) 

        and  

        convert(datetime,convert(varchar,[EndDate],1))
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接