表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个月份的合法记录数总和?|
---------------------------------------------------------------------

解决方案 »

  1.   

    SELECT  COUNT(ID) AS ROW_COUNT  --合法有效的数据 
    FROM 
        A 
    WHERE 
        DATE_F BETWEEN '20070401' AND '20080331'
        and  DATE_T '20070401' AND '20080331'
      

  2.   

    create table a
    (
    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'