WHERE子句查找特定月份的所有记录

Tar*_*rks 67 sql sql-server-2008

我希望能够提供一个月和年的存储过程,并让它返回当月发生的所有事情,我该如何做,因为我无法比较几个月有不同的天数等?

最好的方法是什么?我可以根据年份和月份要求进行比较吗?

谢谢.

Sha*_*mer 157

我认为你正在寻找的功能是MONTH(date).你可能也想用 'YEAR'.

假设您有一个名为的表things,如下所示:

id happend_at
-- ----------------
1  2009-01-01 12:08
2  2009-02-01 12:00
3  2009-01-12 09:40
4  2009-01-29 17:55
Run Code Online (Sandbox Code Playgroud)

而且,假设您要执行以查找happened_at2009/01(2009年1月)期间所有记录.SQL查询将是:

SELECT id FROM things 
   WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009
Run Code Online (Sandbox Code Playgroud)

哪个会回归:

id
---
1
3
4
Run Code Online (Sandbox Code Playgroud)

  • 确实 !对于任何感兴趣的人"DAY,MONTH和YEAR函数分别是DATEPART(dd,date),DATEPART(mm,date)和DATEPART(yy,date)的同义词." (12认同)

Joe*_*Joe 13

使用大多数响应中建议的MONTH和YEAR函数的缺点是SQL Server将无法使用您的日期列上可能存在的任何索引.这可能会破坏大型表的性能.

我倾向于将DATETIME值(例如@StartDate)传递给存储过程,该存储过程代表您感兴趣的月份的第一天.

然后你可以使用

SELECT ... FROM ...
WHERE DateColumn >= @StartDate 
AND DateColumn < DATEADD(month, 1, @StartDate)
Run Code Online (Sandbox Code Playgroud)

如果必须将月份和年份作为单独的参数传递给存储过程,则可以使用CAST和CONVERT生成表示该月第一天的DATETIME,然后按上述步骤操作.如果你这样做,我建议编写一个函数,从整数年,月,日值生成DATETIME,例如SQL Server博客中的以下内容.

create function Date(@Year int, @Month int, @Day int)
returns datetime
as
    begin
    return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
    end
go
Run Code Online (Sandbox Code Playgroud)

然后查询变为:

SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ças 6

更多的一个技巧很简单到oracle db。你也可以使用to_char函数,看看:

月份:

to_char (happened_at , 'MM') = 01

年份:
to_char (happened_at , 'YYYY') = 2009

日:
to_char (happened_at , 'DD') = 01

to_char函数由 sql 语言支持,而不是由一个特定的数据库支持。

我希望能帮助更多人...

腹肌!


And*_*mar 5

作为 MONTH 和 YEAR 函数的替代方案,常规 WHERE 子句也可以使用:

select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
Run Code Online (Sandbox Code Playgroud)