WHERE子句在特定月份查找所有logging

我希望能够给存储过程一个月和一年,让它返回在那个月发生的一切,我怎么做这个,因为我无法比较,因为有些月份有不同的天数等等?

什么是最好的方法来做到这一点? 我可以只是要求根据年份和月份进行比较吗?

谢谢。

我想你正在寻找的function是MONTH(date) 。 您可能也想使用“YEAR” 。

假设你有一个名字如下的表格:

 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月)期间执行查找所有有happen_at的logging。 SQL查询将是:

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

哪个会返回:

 id --- 1 3 4 

使用大多数响应中build议的MONTH和YEAR函数有一个缺点,即SQL Server将无法使用date列上可能存在的任何索引。 这可能会导致大型桌面上的性能下降。

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

你可以使用

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

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

 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)) 

如果您正在使用SQL Server,请查看DATEPART。

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

DATEPART(mm,[你正在查看的date])

然后你可以使用普通的整数逻辑。 同样的一年,只是使用YY而不是毫米。

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

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

我发现传递一个值作为一个时间数据types(例如DATETIME )比较容易,然后使用时间函数,特别是DATEADDDATEPART来查找期间的开始和结束date,在这个例子中是月份,例如,find开始date和结束date对的当前月份,只需将CURRENT_TIMESTAMPreplace为DATETIMEtypes的参数(注意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') 

您可以从表中获取特定年份和月份vise的数据。

select*从表名(其中YEAR( columnname )=' columnname MONTH( columnname )='11'

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

您可以。 以下是使用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 

像这样的东西应该这样做:

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

或者,您可以在创buildlogging时将月份和年份拆分到自己的列中,然后select相应的列。

伊恩

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

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

这将返回任何匹配的月份和年份。

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

月份:

to_char (happen_at,'MM')= 01

年份:

to_char (happen_at,'YYYY')= 2009

对于天:

to_char (happens_at,'DD')= 01

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

我希望能帮助更多的人

腹肌!

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

AAAA是你想要的一年, MM是你想要的月份