我有一个名为 DateFinished 的日期时间字段。我需要能够检索 DateFinished 在当前月份/年份内的所有记录。
问问题
29292 次
3 回答
20
如果您只有少量行,则可以获取DateFinished
今年这个月的所有行。
SELECT *
FROM MyTable
WHERE Year(DateFinished) = Year(CURRENT_TIMESTAMP)
AND Month(DateFinished) = Month(CURRENT_TIMESTAMP)
不过,这可能会在大量行上变得相当慢 - 在这种情况下,使用DateAdd
,DatePart
并且BETWEEN
可能更合适,并且可以利用索引(我现在没有时间写一个涉及这些的答案!)
于 2012-12-05T16:29:51.217 回答
13
作为替代方案 - 这应该使用 DateFinished 上的索引。
SELECT *
FROM MyTable
WHERE DateFinished BETWEEN
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)
于 2012-12-05T17:27:33.663 回答
0
所以@Bridge 方法的问题在于索引的使用。@Moose & @PCurd 的方法存在问题,具体取决于数据的存储方式。
如果一天收集的所有数据都向下舍入到那一天,@PCurd 的方法可以正常工作。例如,下午 5 点的事件记录为 2021-11-30 00:00:00。但是如果保留时间(假设它是 Ops 情况下的日期时间字段),那么这些数据将会丢失。
所以你需要使用 <> 操作符。
SELECT *
FROM MyTable
WHERE DateFinished >=
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND DateFinished <
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)
对于使用 datefromparts 的方法:SQL 选择当前月份的记录
于 2021-12-02T23:18:46.530 回答