我有一个Sql服务器表,其中包含下面的Date值(10月4日)
现在下面的查询未显示任何结果
select
*
from [dbo].[TB_AUDIT] TBA
where TBA.ActionDate >= '10/01/2018' and TBA.ActionDate <= '10/04/2018' which is not correct.
但是如果我写 选择 * 来自[dbo]。[TB_AUDIT] TBA
where TBA.ActionDate >= '10/01/2018' and TBA.ActionDate <= '10/05/2018' it is returning me all results.
我做错了。
答案 0 :(得分:3)
如果您没有为DATETIME
指定时间分量,SQL Server会将其默认为午夜。因此,在第一个查询中,您要查询所有结果<='2018-10-04T00:00:00.000'
。表中的所有数据点都比'2018-10-04T00:00:00.000'
大,因此不会返回任何内容。
您想要
TBA.ActionDate >= '2018-10-01T00:00:00.000' and TBA.ActionDate < '2018-10-05T00:00:00.000'`
答案 1 :(得分:3)
此查询存在两个 问题。首先,它使用的是本地化字符串。在我看来,它似乎要求在1月到4月之间进行查询。明确的 date 格式为YYYYMMDD
。 YYYY-MM-DD
本身可能无法在SQL Server中工作,因为它仍然受该语言的影响。 ODBC日期文字{d'YYYY-MM-DD'}
也可以正常工作。
第二,日期参数没有时间,默认为00:00
。尽管存储的日期具有时间元素,这意味着即使识别出date参数,它们也位于搜索范围之外。
查询应更改为:
select
*
from [dbo].[TB_AUDIT] TBA
where
cast(TBA.ActionDate as date) between '20181001' and '20181004'
或
cast(TBA.ActionDate as date) between {d'2018-10-01'} and {d'2018-10-04'}
通常,将函数应用于字段会阻止服务器使用任何索引。 SQL Server足够聪明,尽管可以将其转换为涵盖整个日期的查询,本质上类似于
where
TBA.ActionDate >='2018:10:01T00:00' and TBA.ActionDate <'2018-10-05T00:00:00'
答案 2 :(得分:1)
使用格式正确的日期!
select *
from [dbo].[TB_AUDIT] TBA
where TBA.ActionDate >= '2018-10-01' and TBA.ActionDate <= '2018-10-04'
YYYY-MM-DD不仅仅是一个好主意。它是大多数数据库都认可的日期格式的ISO标准。
答案 3 :(得分:0)
仅按日期过滤时,是根据标准的时间。