Datetime BETWEEN语句在SQL Server中不起作用

jk9hmnmh  于 2022-12-26  发布在  SQL Server
关注(0)|答案(6)|浏览(154)

我有下面的疑问,

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

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

unftdfkk

unftdfkk1#

您是否有与日期关联的时间?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。

gfttwv5a

gfttwv5a2#

第二个查询返回17号的结果,还是只返回18号的结果?
第一个查询将只返回17日或18日午夜的结果。
试试这个

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

3bygqnnd3#

在SQL Server 2008中,您可以使用"日期"格式。
所以你可以用

SELECT * FROM LOGS WHERE CONVERT(date,[CHECK_IN]) BETWEEN '2013-10-18' AND '2013-10-18'

https://learn.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql

kokeuurv

kokeuurv4#

您的两个查询都没有任何错误。我的猜测如下:

  • 2013年10月17日'和'2013年10月18日'之间不存在记录
  • 第二个查询返回的记录在“2013-10-18”之后存在
mv1qrgav

mv1qrgav5#

您需要将日期字段转换为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))
    )
2nc8po8w

2nc8po8w6#

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'

相关问题