11

我有一个名为 DateFinished 的日期时间字段。我需要能够检索 DateFinished 在当前月份/年份内的所有记录。

4

3 回答 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 回答