使用where子句仅按日期筛选时间戳数据

3

我正在使用where子句提取数据,但数据库中有日期时间戳,我想仅使用日期信息提取数据。

select *
from invoice
where invoice_date = '2019-06-24'

但是我已经将发票日期存入数据库中,发票日期为2019年06月24日04:30:00.000。

3个回答

2
将其转换为日期:
select *
from invoice
where CAST(invoice_date as DATE) = '2019-06-24'

这个解决方案的一个问题是,它不会使用日期列上的索引,除非索引是建立在转换值的计算上,而这种情况非常罕见。 - undefined
其实,我也尝试过进行类型转换,但在第一次尝试时没有成功,不过现在它已经可以工作了。谢谢你的帮助。 - undefined
1
这并不完全正确,@RacilHilan。CAST(... AS date)CONVERT(date,..)是可搜索的(但这并不意味着你应该这样做)。关于这个问题在DBA上有一篇文章,但我在谷歌上找不到。 - undefined
@Larnu 是的,我的评论不准确,但我只是想指出一个问题,而不深入细节,因为评论的空间有限。你是对的,它们是可搜索的,并且会使用索引,但效率不如使用范围查询高。而且,由于使用范围查询非常简单,没有必要为转换付出性能代价。对于不准确的评论,我表示道歉。 - undefined
可搜索的 - 但是你应该使用它吗? - undefined
@SMor 这是一个很好的解释,并且在第二个回答中进行了很好的跟进。我应该提供这样一个链接,而不是给出一个简化且不准确的答案。谢谢分享。 - undefined

2
我个人会使用“正确的”日期逻辑:
SELECT {Column List}
FROM dbo.invoice i
WHERE i.invoice_date >= '2019-06-24'
  AND i.invoice_date < '2019-06-25';

如果您使用参数,则需要使用DATEADD函数:
SELECT {Column List}
FROM dbo.invoice i
WHERE i.invoice_date >= @DateParam
  AND i.invoice_date < DATEADD(DAY, 1, @DateParam);

2

有两种方法可以实现你想要的目标。一种是将时间戳转换为日期格式,这样非常易读;另一种是使用时间范围。

select *
from invoice
where invoice_date >= '2019-06-24' and invoice_date < '2019-06-25';

使用时间范围略微不易读懂,但如果您在invoice_date上建立了索引,则可以使用它,因此查询可能会更快运行。


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