对于大学课程,我已经完成了以下任务
假设我们有一个员工表,如(first_name,last_name,salary,hire_date,...)。有条例规定,每年雇用一名雇员后,他/她必须与公司续签合同。显示每位员工下次续订前剩余的月数。
这是我的尝试:
select (abs(months_between(sysdate,hire_date)/12 -
round((months_between(sysdate,e.hire_date))/12)))
from employees e
是正确的吗?或者正确的实施
答案 0 :(得分:0)
你是那里的一部分,但不是这样 - 到目前为止你所拥有的将显示自雇用日期以来的月数模数除以12,作为一个分数。
你需要的是从12日减去自雇用日期起的月数模数除以12,作为一个整数。
举一个例子,13个月前被聘用的员工将在您提供的查询中返回0.0833333 - 您希望看到(12 - (13/12的剩余部分作为整数)的结果 - 即1 ))= 11个月。
大多数SQL都有模数函数,尽管名称和语法可能因SQL而异。
另外,我会修改您的查询以包含e.*
以及您在select语句中的计算。
答案 1 :(得分:0)
如果您从这样的表开始:
create table my_table (
first_name varchar(15),
last_name varchar(15),
salary integer,
hire_date date
);
insert into my_table values ('A', 'Beemer', 30000, '2011-01-15');
insert into my_table values ('B', 'Catalog', 31000, '2011-01-27');
insert into my_table values ('C', 'Doir', 45000, '2011-03-11');
您可以使用SELECT语句返回类似这样的结果。
first_name last_name salary hire_date renewal_date days_to_renewal
--
A Beemer 30000 2011-01-15 2012-01-15 57
B Catalog 31000 2011-01-27 2012-01-27 69
C Doir 45000 2011-03-11 2012-03-11 113
你应该记住,“月”是一个模糊的词,大多数数据库人都讨厌白热化,激情四射。在真实日历上,它可能意味着28天,29天,30天或31天。当期望与常识不符时,你总会受到指责。
对我的数据运行查询会返回这些值。显然是错的。
LAST_NAME MONTHS_TO_RENEWAL
Beemer .154442577658303464755077658303464755078
Catalog .186700642174432497013142174432497013143
Doir .310356556152927120669056152927120669056
记录的Oracle has a months_between() function返回“两个日期之间的月数”。您需要准确了解“月数”对此功能的意义。 (同样,假设一个日历月可能有28天,29天,30天或31天。)如果您希望以任何其他方式进行算术,我会感到非常惊讶。
我建议你从这开始,并填写三个缺失的部分。
select first_name, last_name, salary, hire_date,
('date arithmetic to calculate the renewal date') renewal_date,
months_between('one date', 'another date') months_to_renewal
from my_table;