表结构如下
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的钱.
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 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
-- 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
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 行)
*/
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 行)
*/
所以需要减去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)
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/的钱就是说,你是当月收取了当月的钱, 所以需要减一.
如果是按照后面的要求,则不需要减一.
需求就是:当月收当的钱!如果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/的钱
b公司在2009/12/10开始收了3个月(2010/01,2010/02,2010/03). 代表这个月收下个月的钱,就不用-1
b公司在2009/12/10开始收了3个月(2009/12,2010/01,2010/02). 代表这个月收当月的钱,就要-1是这个意思吧!