两个日期之间的SQL连接

时间:2016-05-12 18:57:13

标签: sql date join

我们说我有两张桌子:

员工:

Name    id    beg_eff_date    end_eff_date    group
Jack    101a  01-01-16        03-31-16        4
Jack    101a  04-01-16        12-31-99        3

销售

emp_id    sale_amt    sale_date
101a      25          01-22-16
101a      28          04-10-16

我想要的输出:

emp_id    sale_amt    sale_date    name    group
101a      25          01-22-16     Jack    4
101a      28          04-10-16     Jack    3

这是我正在使用的代码,但它似乎在至少一种情况下(使用我的真实数据集)不起作用,所以我想确保我写得正确:

select sales.emp_id, sales.sale_amt, sales.sale_date, 
    emp.name, emp.group
from sales
inner join employees emp
    on sales.emp_id = emp.id
where sales.sale_date between emp.beg_eff_date and emp.end_eff_date

此处的目标是获取销售时员工所在的组编号。

非常感谢!

2 个答案:

答案 0 :(得分:0)

您的评论员似乎走在了正确的轨道上。您的BETWEEN子句似乎正在处理文本数据,而不是日期数据。您将不得不将其强制转换为日期数据类型以使其正常工作。您可能需要考虑更改源表以始终使用日期数据类型作为其日期。然后,每次你想做日期数学时,你都不需要使用下面的混乱。 "这个混乱":

select sales.emp_id, sales.sale_amt, sales.sale_date, 
    emp.name, emp.group
from sales
inner join employees emp
    on sales.emp_id = emp.id
where CONVERT(Date, iif(RIGHT(sales.sale_date, 2) < 50, '20', '19') + RIGHT(sales.sale_date, 2) + '-' + LEFT(sales.sale_date, 2) + '-' + SUBSTRING(sales.sale_date, 4, 2)) 
between  
  CONVERT(Date, iif(RIGHT(emp.beg_eff_date, 2) < 50, '20', '19') + RIGHT(emp.beg_eff_date, 2) + '-' + LEFT(emp.beg_eff_date, 2) + '-' + SUBSTRING(emp.beg_eff_date, 4, 2)) 
and 
  CONVERT(Date, iif(RIGHT(emp.end_eff_date, 2) < 50, '20', '19') + RIGHT(emp.end_eff_date, 2) + '-' + LEFT(emp.end_eff_date, 2) + '-' + SUBSTRING(emp.end_eff_date, 4, 2))

答案 1 :(得分:0)

这是我以前用过的有效日期逻辑的类型,所以请原谅旧的SQL语法:

select sales.emp_id, sales.sale_amt, sales.sale_date, 
    emp.name, emp.group
from sales, employees emp 
where sales.emp_id = emp.id
and emp.group in
  (select emp2.group 
   from employees emp2
   where emp2.emp_id = emp.emp_id
   and sales.sale_date between emp2.beg_eff_date and emp2.end_eff_date)

我假设那些eff_date列是实际的日期类型。