【问题标题】:select from database从数据库中选择
【发布时间】:2012-01-01 23:35:17
【问题描述】:

对于大学课程,我被分配了以下任务

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

是正确的吗?或者什么是正确的实现

【问题讨论】:

  • 您已经可以创建一些测试数据,并测试您自己的代码——事实上,在您提交作业时提供您的测试用例数据和测试结果,单元测试是开发生活的一部分。

标签: sql


【解决方案1】:

您是其中的一部分,但事实并非如此 - 您目前所拥有的将显示自雇用日期以来的月模数除以 12,作为分数。

您需要从 12 中减去自入职日期以来的月模数除以 12 的整数。

举个例子,13 个月前被雇用的员工将在您提供的查询中返回 0.0833333 - 您希望看到 (12 - (13/12 的余数作为整数 - 即 1 )) = 11 个月。

大多数 SQL 风格都有一个模数函数,尽管 SQL 的名称和语法可能有所不同。

另外,我会修改您的查询以在您的选择语句中包含e.* 以及您的计算。

【讨论】:

  • 模数是绝对值还是?
  • 模数 = 余数。绝对值与您的答案无关,因为它所做的只是删除一个减号。
【解决方案2】:

如果你从这样的表开始:

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;

【讨论】:

  • 对不起我出去了,我不明白一件事感谢创建表格代码,我知道,例如,如果某人在 2007 年 3 月 5 日的数据中被雇用,这意味着剩下大约 3- 4个月续约,月之间算入职后还有多少个月,还要加什么?
  • 所以这意味着我应该使用这个代码?select floor(12-mod(months_between(sysdate,hire_date), 12)) from employees
  • @dato:我们无法知道您应该在作业中使用什么代码。我们可以告诉你是否得到正确答案,但你可以自己说,对吧?
  • 即使有代码也没问题,我很感兴趣,请告诉我我的代码对吗?
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2011-03-12
  • 2016-12-17
  • 1970-01-01
  • 2014-07-05
  • 2013-04-26
相关资源
最近更新 更多