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_at
2009/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)
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)
作为 MONTH 和 YEAR 函数的替代方案,常规 WHERE 子句也可以使用:
select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
300756 次 |
最近记录: |