我希望能够给存储过程一个月和一年,并使其返回该月发生的所有事情,我该怎么做,因为在某些月份的天数不同等情况下我无法进行比较?
最好的方法是什么?我可以要求根据年份和月份进行比较吗?
谢谢。
Answers:
我认为您正在寻找的功能是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
假设您要执行查找所有在happened_at
2009/01月份(2009年1月)中具有的记录。SQL查询为:
SELECT id FROM things
WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009
哪个会返回:
id
---
1
3
4
大多数响应中建议使用MONTH和YEAR函数的缺点是SQL Server将无法使用日期列上可能存在的任何索引。这会破坏大桌子上的性能。
我倾向于将DATETIME值(例如@StartDate)传递给表示您感兴趣的月份的第一天的存储过程。
然后,您可以使用
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
如果必须将月和年作为单独的参数传递给存储过程,则可以使用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
该查询将变为:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
@EndDate
将使其明确。
如果您使用的是SQL Server,请查看DATEPART。
http://msdn.microsoft.com/zh-CN/library/ms174420(SQL.90).aspx
DATEPART(毫米,[您正在寻找的日期])
然后,您可以使用普通的整数逻辑。与年份相同,只需使用yy而不是mm。
我发现更容易将值作为时间数据类型(例如DATETIME
)传递,然后使用时间功能(特别是DATEADD
和DATEPART
)来找到该期间的开始日期和结束日期,在这种情况下是月份,例如,这将找到开始日期和结束日期对对于当前月份,只需替换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')