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

时间:2009-05-12 05:15:46

标签: sql sql-server-2008

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

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

感谢。

10 个答案:

答案 0 :(得分:147)

我认为您正在寻找的功能是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

让我们假设您要执行以查找2009/01(2009年1月)期间happened_at的所有记录。 SQL查询将是:

SELECT id FROM things 
   WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009

哪会回来:

id
---
1
3
4

答案 1 :(得分:12)

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

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

然后您可以使用

SELECT ... FROM ...
WHERE DateColumn >= @StartDate 
AND DateColumn < DATEADD(month, 1, @StartDate)

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

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

然后查询变为:

SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))

答案 2 :(得分:3)

更多一个提示非常简单。您也可以使用to_char函数,看看:

月份:

to_char (happen_at,'MM')= 01

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

对于日:

to_char (happen_at,'DD')= 01

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

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

阿布斯!

答案 3 :(得分:2)

如果您使用的是SQL Server,请查看DATEPART。

http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx

DATEPART(mm,[你正在寻找的日子])

然后,您可以使用普通的整数逻辑。年份相同,只需使用yy而不是mm。

答案 4 :(得分:2)

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

select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'

答案 5 :(得分:1)

我发现将值作为时态数据类型(例如DATETIME)传递然后使用时态功能(特别是DATEADDDATEPART)来查找开始和结束日期更容易期间,在这种情况下是月份,例如这会找到当前月份的开始日期和结束日期对,只需将CURRENT_TIMESTAMP替换为DATETIME类型的参数(请注意1990-01-01值完全是任意的):

SELECT DATEADD(M, 
          DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), 
          '1990-01-01T00:00:00.000'), 
       DATEADD(M, 
          DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), 
          '1990-01-31T23:59:59.997')

答案 6 :(得分:0)

  

我可以要求根据年份和月份进行比较吗?

你可以。这是一个使用AdventureWorks示例数据库的简单示例...

DECLARE @Year       INT
DECLARE @Month      INT

SET @Year = 2002
SET @Month = 6

SELECT 
    [pch].* 
FROM 
    [Production].[ProductCostHistory]   pch
WHERE
    YEAR([pch].[ModifiedDate]) = @Year
AND MONTH([pch].[ModifiedDate]) = @Month

答案 7 :(得分:0)

这样的事情应该这样做:

select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year

或者,您可以在创建记录时将月份和年份拆分为自己的列,然后选择它们。

伊恩

答案 8 :(得分:0)

一种方法是创建一个代表本月第一个(即5/1/2009)的变量,将其传递给proc或构建它(连接月/ 1 /年)。然后使用DateDiff函数。

WHERE DateDiff(m,@Date,DateField) = 0

这将返回具有匹配月份和年份的任何内容。

答案 9 :(得分:-3)

SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';

AAAA是您想要的年份,MM是您想要的月份