数据库简单结构
字段 | 类型 |
---|---|
id | varchar2 |
name | varchar2 |
birth | date |
做项目时,需要实现导入年龄段在15~25岁的人员,但是一直无法准确的导入。所以只能手写日期,SQL语句如下
SELECT id, name FROM user
WHERE birth>=to_date('1997-05-24','yyyy-mm-dd')
AND birth<= to_date('2007-05-04','yyyy-mm-dd');
虽然还没有需要再导入一次别的年龄段,但是如果每次手写又很麻烦,在网上找到可以使用以下方法:
SELECT id, name FROM user
WHERE months_between(sysdate ,BIRTH_TIME)/12<=25
and months_between(sysdate,BIRTH_TIME)/12>=15
这样就可以传入参数实现SQL复用了。
有一些需要注意的事项: sysdate返回的日期格式是带时间的,如2022-5-24 17:13:00 ,如果不希望时间也参与计算,可以在外层嵌套trunc(sysdate,'dd')。
SELECT id, name FROM user
WHERE months_between(trunc(sysdate ,'dd') ,BIRTH_TIME)/12<=25
AND months_between(trunc(sysdate ,'dd'),BIRTH_TIME)/12>=15
最重要的是,如果数据量大在执行的时候到了另一天,那么数据就不对了,所以最好是在执行方法的时候单例获取一个固定的时间,然后作为参数传入SQL语句中,保证执行的结果的正确性。
所以上面使用SQL服务端的sysdate作为时间判断是不太合适的,可以将sysdate换为传入参数。