Oracle - 选择在过去20年中雇用的员工

时间:2014-06-08 16:14:36

标签: sql oracle

我不能使用months_between,只允许玩DATE,所以我得到了这个:

select * from emp
where ((SYSDATE- hiredate)/(365+1/4-1/100+1/400)) >= ((SYSDATE/(365+1/4-1/100+1/400))-20);

我不明白为什么我会在

中收到错误
(SYSDATE/(365+1/4-1/100+1/400))-20

说它是无效的数据类型“不一致的数据类型:预期%s得到%s”时

(SYSDATE-hiredate)/(365+1/4-1/100+1/400)

正常运行,没有错误,WTF?

PS:使用(365 + 1 / 4-1 / 100 + 1/400)的例子是出生日期,更精确:

((SYSDATE- birth_date)/(365+1/4-1/100+1/400)) >=18

2 个答案:

答案 0 :(得分:2)

sysdate返回当前日期和时间。

在下面的第二个测试用例中,您将减去两个返回的日期 数值表示两个日期之间的天数,因此计算(分割成为可能)。

(SYSDATE-hiredate)/(365+1/4-1/100+1/400)

在您的第一个测试用例中,您将直接尝试划分日期类型值。 你不能在oracle中划分日期数据类型。相反,您可以添加任何值x(sysdate +x),这意味着您要将x天添加到日期值。

(SYSDATE/(365+1/4-1/100+1/400))-5

如果您要将sysdate转换为数字,可以尝试如下

select to_number(to_char(sysdate, 'yyyymmddhh24miss')) from dual; 

今天会像20140608165750一样返回DATE + TIME。

(OR)

select to_number(to_char(sysdate, 'yyyymmdd')) from dual;

结果将是20140608(仅限DATE部分)

答案 1 :(得分:0)

根据Oracle减去两个Date数据类型,您将获得Number数据类型。 来自Oracle文档:Reference

所以这部分你的查询
 ((SYSDATE- birth_date)/(365+1/4-1/100+1/400)) >=18返回一个数字,而

在此声明中,(SYSDATE/(365+1/4-1/100+1/400))-5 sysdate仍被视为日期数据表,这就是您收到错误的原因。您可以明确使用to_number将sysdate转换为数字。

编辑:尝试使用此((to_number(to_char(SYSDATE,'DDMMYYYY'))/(365+1/4-1/100+1/400))-5)将sysdate date dataype转换为number数据类型。因此,您的选择查询应该如下所示

select * from emp
where ((SYSDATE- hiredate)/(365+1/4-1/100+1/400)) >= ((to_number(to_char(SYSDATE,'DDMMYYYY'))/(365+1/4-1/100+1/400))-5);