从数据库中选择

时间:2011-11-19 16:23:09

标签: sql

对于大学课程,我已经完成了以下任务

假设我们有一个员工表,如(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

是正确的吗?或者正确的实施

2 个答案:

答案 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;