今天开发CRM的一个小功能,需求大概是这样的:
有一张存储客户信息的表,这个表中有一个列代表着该用户的“提醒时间”,它意为:如果当前时间大于等于这个值,那么该用户就需要在展示的时候被标记为“需要提醒”,并且需要展示需要提醒的条数。
其实这个问题不应该是个大问题,只不过本人oracle比较薄弱,需要进行记录,以便后查。
经过调查,我发现了如下几个函数对于实现本需求有帮助::
1:符号判断函数 sign
函数语法:
sign(n)
函数说明:
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
示例:
一、select sign( 100 ),sign(- 100 ),sign( 0 ) from dual;
SIGN(100) SIGN(-100) SIGN(0)
———- ———- ———-
1 -1 0
二、a=10,b=20
则sign(a-b)返回-1
2:值比较函数 decode
函数说明:
根据条件返回相应值
示例:
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
或:
when case 条件=值1 THEN
RETURN(翻译值1)
ElseCase 条件=值2 THEN
RETURN(翻译值2)
......
ElseCase 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END
感觉这两个函数就足够了,那么现在理清楚写sql的思路:
比较每条记录的“提醒时间”,过期或者到期就意味着需要设置提醒。
1:先比较两个时间表:crm_lwh_custinfo
字段:remind_date(Date)
1 sign(to_date(t.remind_date,'yyyy.mm.dd')-to_date(sysdate,'yyyy.mm.dd'))
根据sign函数的返回值进一步设置sql要返回的值
2:根据sign函数的返回值,通过decode函数设定sql要返回的值
过期或者到期都用1标识,未到期,也就是默认值用0标识
1 select decode(sign(to_date(t.remind_date,'yyyy.mm.dd')-to_date(sysdate,'yyyy.mm.dd')),-1,1,0,1,0)
as need_remind from crm_lwh_custinfo t
如果你看到这里觉得有什么更好的办法,或者觉得这种写法有什么不足,欢迎留言。