读书人

请问一个字段值比较的SQL语句

发布时间: 2012-03-21 13:33:14 作者: rapoo

请教一个字段值比较的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 tbgocreate table tb( 签合同时间 datetime, 合同期限 varchar(10))goinsert into tbselect '2010-11-30','1' union allselect '2011-01-01','1' union allselect '2009-01-01','长期' union allselect '2008-05-05','3'goselect * from tb where 合同期限<>'长期' and datediff(mm,dateadd(yy,cast(合同期限 as int),签合同时间),getdate())<3go/*签合同时间                   合同期限----------------------- ----------2010-11-30 00:00:00.000 12011-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

读书人网 >SQL Server

热点推荐