表A结构如下
TABLE A(PK: ID && DATE_F)
ID DATE_F DATE_T
001 20070101 20071231
001 20070401 20071031
001 20070701 20080131
002 20080101 20080331
003 20080301 20080331
要求:找出A表中2007年4月--2008年3月间所有合法的数据记录条数
数据合法的依据:
以这12个月份每个月的最后一天作为【基准日】,
算出当月的有效数据条数(【基准日】BETWEEN DATE_F AND DATE_T)
然后再计算出12个月份的记录条数总和。
譬如2007年4月的有效数据应当是:
SELECT
COUNT(ID) AS ROW_COUNT --合法有效的数据
FROM
A
WHERE
'20070430' BETWEEN DATE_F AND DATET
解释一下,以第3条记录为例,它在2007/07、2007/08、2007/09、2007/10、2007/11、2007/12、2008/01这几个月份都是合法的数据,因此在这几个月份有效数据的COUNT中都应该包含这一条记录。
不知道我表述清楚没有?
---------------------------------------------------------------------
现在问题就是:怎么来组织一个简炼高效的SQL语句来找出12个月份的合法记录数总和?|
---------------------------------------------------------------------
TABLE A(PK: ID && DATE_F)
ID DATE_F DATE_T
001 20070101 20071231
001 20070401 20071031
001 20070701 20080131
002 20080101 20080331
003 20080301 20080331
要求:找出A表中2007年4月--2008年3月间所有合法的数据记录条数
数据合法的依据:
以这12个月份每个月的最后一天作为【基准日】,
算出当月的有效数据条数(【基准日】BETWEEN DATE_F AND DATE_T)
然后再计算出12个月份的记录条数总和。
譬如2007年4月的有效数据应当是:
SELECT
COUNT(ID) AS ROW_COUNT --合法有效的数据
FROM
A
WHERE
'20070430' BETWEEN DATE_F AND DATET
解释一下,以第3条记录为例,它在2007/07、2007/08、2007/09、2007/10、2007/11、2007/12、2008/01这几个月份都是合法的数据,因此在这几个月份有效数据的COUNT中都应该包含这一条记录。
不知道我表述清楚没有?
---------------------------------------------------------------------
现在问题就是:怎么来组织一个简炼高效的SQL语句来找出12个月份的合法记录数总和?|
---------------------------------------------------------------------
FROM
A
WHERE
DATE_F BETWEEN '20070401' AND '20080331'
and DATE_T '20070401' AND '20080331'
(
id int identity(1,1) not null,
dateBegin datetime,
dateEnd datetime
)insert into a select '05/13/2007',getdate()
insert into a select '05/13/2007','03/13/2006'
insert into a select '07/23/2007',getdate()
insert into a select '01/13/2007',getdate()select * from acreate proc countdate
(
@begin datetime,
@end datetime
)
as
begin
select count(*) from a where datebegin>=@begin and dateend <=@end--大于等于开始日期,小于等天结束日期
--如果是当前年份的最后一天
declare @last varchar(20)
set @last='12/31/'+cast(year(getdate()) as char(4))
select count(*) from a where datebegin>=@begin and dateend<=cast(@last as datetime)
end
exec countdate '04/01/2007','12/01/2008'