之前在网络查询了一下关于使用sql 查询 “几个工作日之后的日期”的问题,大意就是,假设今天是周三(2014/08/27),三个工作日之后(包含周三)就是周五(20140929),四个工作日之后,就是下周一(20140901),如果遇到法定节假日,则当周末处理(如周一是中秋节,则周一不算是工作日)。看了好几个答复,感觉实现起来都挺复杂的,今天学到一种比较简单的处理方法,希望对你有好处。

建立一个时间表 sjb,格式如下:

日期(tjrq) 节假日类型(type)
YYYYMMDD 0 工作日,1 正常周末,2 节假日。

节假日,可以是法定节假日,也可以自定义的特殊节假日。

对于时间表,我们需要在数据库预先设置整一年或几年的数据,那对于查询出(今天)三个工作日之后的日期,其实就是查询日期类型为 1,往后的第三条数据即可,为了在效率上更快,可以考虑分页来实现。

如在 Oracle 上的查询可以是:(在实际实现中,往往需要传入今天的日期(20140828),第几个工作日 3)

select * from ( select r.*, rownum rn from (

select tjrq from sjb where tjrq >= 20140828 and type= 0 order by tjrq asc

)r where rownum<=3 )pg where pg.rn= 3

在 mysql 上的查询如下:

select tjrq from sjb where tjrq >= 20140828 and type= 0 order by tjrq asc limit 3,1

 

鉴于需要预先初始化数据,需要占用一定的数据库空间,不过一年才 300 多条数据,这样的存储空间,不在考虑范围之类。