我们说我有两张桌子:
员工:
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
此处的目标是获取销售时员工所在的组编号。
非常感谢!
答案 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列是实际的日期类型。