表结构如下
id          corpname          month          startdate                                                 enddate
1            a                          1                   2009-12-10 08:12:00                           2009-12-11 12:00:00
2            b                          3                   2009-12-10 08:12:00                           2009-12-11 12:00:00
3            c                           1                  2010-01-07  08:12:00                           null
查询本月已经收过费的单位
id          corpname          
2           b                           
3           c说明:
b公司在2009/12/10开始收了3个月(2009/12,2010/01,2010/02).明显已经收了2010/01/的钱
c公司在2010/01/07开始收2010/01的钱,但尚未结束
a公司在2009/12/10开始收2009/12的钱.

解决方案 »

  1.   

    id  corpname  month   startdate               enddate
    1   a         1       2009-12-10 08:12:00     2009-12-11 12:00:00
    2   b         3       2009-12-10 08:12:00     2009-12-11 12:00:00
    3   c         1       2010-01-07  08:12:00    null
      

  2.   

    ------------------------------------------------------------------------
    -- Author : HappyFlyStone 
    -- Date   : 2010-01-08 10:37:40
    -- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
    --       Apr 14 2006 01:12:25 
    --       Copyright (c) 1988-2005 Microsoft Corporation
    --       Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
    --      
    -------------------------------------------------------------------------- Test Data: ta
    IF OBJECT_ID('[ta]') IS NOT NULL 
        DROP TABLE [ta]
    Go
    CREATE TABLE ta([id] INT,[corpname] NVARCHAR(1),[month] INT,[startdate] DATETIME,[enddate] DATETIME)
    Go
    INSERT INTO ta
       SELECT 1,'a',1,'2009-12-10 08:12:00','2009-12-11 12:00:00' UNION ALL
       SELECT 2,'b',3,'2009-12-10 08:12:00','2009-12-11 12:00:00' UNION ALL
       SELECT 3,'c',1,'2010-01-07 08:12:00',Null 
    GO
    --Start
    SELECT 
    id,corpname
    FROM
    TA
    where 
        convert(char(7),dateadd(mm,month,startdate),120) > convert(char(7),getdate(),120)--Result:
    /*
    id          corpname
    ----------- --------
    2           b
    3           c(2 行受影响)*/
    --End 
      

  3.   

    create table tb(id int, corpname varchar(10), [month] int, startdate datetime, enddate datetime)
    insert into tb values(1 , 'a' , 1 , '2009-12-10 08:12:00' , '2009-12-11 12:00:00') 
    insert into tb values(2 , 'b' , 3 , '2009-12-10 08:12:00' , '2009-12-11 12:00:00') 
    insert into tb values(3 , 'c' , 1 , '2010-01-07 08:12:00' , null)
    go--需要使用临时表。
    SELECT TOP 8000 id = IDENTITY(int,0, 1) INTO # FROM syscolumns a, syscolumns b select m.id , m.corpname
    from tb m, # n
    where n.id <= m.[month] - 1
    and convert(varchar(7),dateadd(mm,n.id,startdate),120) = convert(varchar(7),getdate(),120)drop table tb ,#/*
    id          corpname   
    ----------- ---------- 
    2           b
    3           c(所影响的行数为 2 行)
    */
      

  4.   

    考虑复杂了,这样即可.create table tb(id int, corpname varchar(10), [month] int, startdate datetime, enddate datetime)
    insert into tb values(1 , 'a' , 1 , '2009-12-10 08:12:00' , '2009-12-11 12:00:00') 
    insert into tb values(2 , 'b' , 3 , '2009-12-10 08:12:00' , '2009-12-11 12:00:00') 
    insert into tb values(3 , 'c' , 1 , '2010-01-07 08:12:00' , null)
    goselect m.id , m.corpname
    from tb m
    where convert(varchar(7),dateadd(mm,m.[month]-1,startdate),120) >= convert(varchar(7),getdate(),120)drop table tb/*
    id          corpname   
    ----------- ---------- 
    2           b
    3           c(所影响的行数为 2 行)
    */
      

  5.   

    因为当前日期如果是12月,你的[month]为1,如果用dateadd(mm,[month],startdate),则加到下个月去了.
    所以需要减去1.有关这个函数的用法见下:
    DATEADD
    在向指定日期加上一段时间的基础上,返回新的 datetime 值。语法
    DATEADD ( datepart , number, date ) 参数
    datepart是规定应向日期的哪一部分返回新值的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。日期部分 缩写 
    Year yy, yyyy 
    quarter qq, q 
    Month mm, m 
    dayofyear dy, y 
    Day dd, d 
    Week wk, ww 
    Hour hh 
    minute mi, n 
    second ss, s 
    millisecond ms 示例
    此示例打印出 pubs 数据库中标题的时间结构的列表。此时间结构表示当前发布日期加上 21 天。USE pubs
    GO
    SELECT DATEADD(day, 21, pubdate) AS timeframe
    FROM titles
    GO下面是结果集:timeframe                   
    --------------------------- 
    Jul 3 1991 12:00AM          
    Jun 30 1991 12:00AM         
    Jul 21 1991 12:00AM         
    Jul 13 1991 12:00AM         
    Jun 30 1991 12:00AM         
    Jul 9 1991 12:00AM          
    Mar 14 1997  5:09PM         
    Jul 21 1991 12:00AM         
    Jul 3 1994 12:00AM          
    Mar 14 1997  5:09PM         
    Nov 11 1991 12:00AM         
    Jul 6 1991 12:00AM          
    Oct 26 1991 12:00AM         
    Jul 3 1991 12:00AM          
    Jul 3 1991 12:00AM          
    Nov 11 1991 12:00AM         
    Jul 3 1991 12:00AM          
    Jul 3 1991 12:00AM          (18 row(s) affected)
      

  6.   

    你的说明为:说明: 
    b公司在2009/12/10开始收了3个月(2009/12,2010/01,2010/02).明显已经收了2010/01/的钱 
    c公司在2010/01/07开始收2010/01的钱,但尚未结束 
    a公司在2009/12/10开始收2009/12的钱.如果是:
    说明: 
    b公司在2009/12/10开始收了3个月(2010/01,2010/02,2010/03).明显已经收了2010/01/的钱就是说,你是当月收取了当月的钱, 所以需要减一.
    如果是按照后面的要求,则不需要减一.
      

  7.   

    re:
    需求就是:当月收当的钱!如果month=1的话,你这句我有点不明白?
    我打的
    --------------------------------
    b公司在2009/12/10开始收了3个月(2009/12,2010/01,2010/02).明显已经收了2010/01/的钱   
      --->这不表示收了3个月的钱么?你打的这个
    --------------------------------
    如果是:
    说明:
    b公司在2009/12/10开始收了3个月(2010/01,2010/02,2010/03).明显已经收了2010/01/的钱 
      

  8.   

    re:毓华
    b公司在2009/12/10开始收了3个月(2010/01,2010/02,2010/03).  代表这个月收下个月的钱,就不用-1
    b公司在2009/12/10开始收了3个月(2009/12,2010/01,2010/02).  代表这个月收当月的钱,就要-1是这个意思吧!