我不能使用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
答案 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);