日期:2014-05-18  浏览次数:20593 次

请教一个字段值比较的SQL语句
有个合同表T,有如下字段:
员工ID
签合同时间(smalltime类型)
合同期限(nvarchar(4)类型,因为合同期限可能是“3”年、“5”年,也可能是“长期”,所以不能设置为int类型)。

现在要实现一个合同到期提醒功能,比如输入一个月份参数(3个月),要查询出到期时间小于3个月的所有员工记录,请问这条SQL语句应该怎样写呢?
谢谢!

------解决方案--------------------
SQL code
select * from tb where isnumeric(合同期限)=1 and datediff(month,getdate(),签合同时间)<3

------解决方案--------------------
--假设只针对合同期限为年的,并且考虑日期。

select * from t where charindex('年' , 合同期限) > 0 and 
((datediff(mm,dateadd(yy,cast(replace(合同期限,'年','') as int),签合同时间),getdate()) < 3) or 
(datediff(mm,dateadd(yy,cast(replace(合同期限,'年','') as int),签合同时间),getdate()) = 3 and 
right(convert(varchar(10),签合同时间,120),5) > right(convert(varchar(10),getdate(),120),5)))
------解决方案--------------------
SQL code
select * from t where charindex('年',合同期限)>0 and datediff(mm,dateadd(yy,cast(
replace(合同期限,'年 ','') as int),签合同时间),getdate())<3

------解决方案--------------------
SQL code

--长期的是不是不计算
if object_id('tb') is not null
   drop table tb
go
create table tb
(
 签合同时间 datetime,
 合同期限 varchar(10)
)
go
insert into tb
select '2010-11-30','1' union all
select '2011-01-01','1' union all
select '2009-01-01','长期' union all
select '2008-05-05','3'
go
select * from tb where 合同期限<>'长期' and datediff(mm,dateadd(yy,cast(合同期限 as int),签合同时间),getdate())<3
go
/*
签合同时间                   合同期限
----------------------- ----------
2010-11-30 00:00:00.000 1
2011-01-01 00:00:00.000 1

(2 行受影响)
*/

------解决方案--------------------
你需要把合同期限不是"长期"的筛选出来即可,我上面是筛选包含年的,你可以使用合同期限<>'长期'

------解决方案--------------------
这个是设计上的问题,加个到期时间,如果是长期合同,默认到期时间比如设置+20年,这样你不用判断和同期限多长,直接计算距离现在时间3个月的就行。
Select * From T Where DateDiff(mm, GetDate(),到期时间) < 3

如果已经设计好了,有数据了,必须这样做,那么就用
Select * From T Where isNumeric(合同期限)=1 And DateDiff(mm, GetDate(),到期时间) < 3