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
)比较容易,然后使用时间函数,特别是DATEADD
和DATEPART
来查找期间的开始和结束date,在这个例子中是月份,例如,find开始date和结束date对的当前月份,只需将CURRENT_TIMESTAMP
replace为DATETIME
types的参数(注意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
是你想要的月份