在sql中,如何过滤两个连接表中的记录

时间:2017-03-28 15:56:11

标签: sql-server

我输出由两个单独的数据表中的信息组成的发票,这些数据表由唯一的ID#链接。我需要更新一组发票(table_B中包含的服务信息)中提供的服务,仅限于特定日期(table_A中包含的日期信息)。

这是我加入的两张桌子

表-A

ID------|Name-----------------|Date----------|Total--------|

1-------|--ABC Company--------|--1/1/17------|--$50--------|

2-------|--John Smith---------|--3/1/17------|--$240-------|

3-------|--Mary Jones---------|--2/1/16------|--$320-------|

1-------|--ABC Company--------|--8/1/16------|--$500-------|

表-B

Table_ID (= ID Table_A)----|-Service-----------|Unit Price--|Qty------| 


1--------------------------|--Service A--------|--$50.00----|--10-----|
                                         --
2--------------------------|--Service B--------|--$20.00----|--12-----|
                                         --
3--------------------------|--Service B--------|--$20.00----|--16-----|
                                         --
1--------------------------|--Service A--------|--$50.00----|--10-----|

我可以使用以下方法加入这两个表:

从Table_B中选择* b内连接Table_A a on b.Table_ID = a.ID

结果如下:

结果

Table_ID-|-Service-----|-Unit Price-|-Qty-|-ID--|-Name-----|-Date----|Total--|

1--------|-Service A-  |$50.00------|-10--|-1---|-ABC Co.--|-1/1/17--|$500--|

2--------|-Service B-  |$20.00------|-12--|-2---|-John S.--|-3/1/17--|$240--|

3--------|-Service B-  |$20.00------|-16--|-3---|-Mary J.--|-2/1/16--|$320--|

1--------|-Service A-  |&50.00------|-10--|-1---|-ABC Co.--|-8/1/16--|$500--|

现在,我只想要日期为12/31/16的行。但是,当我为日期添加where子句时(见下文),我的结果不会改变。

Select * from Table_B b inner join Table_A a on b.Table_ID = a.ID where date > 12/31/16

我希望在1/1/17和3/1/17上只提供两行服务。如何在此新连接的表中仅过滤具有特定日期值的行?

4 个答案:

答案 0 :(得分:1)

假设您的日期包含在用于存储日期而不是字符串的列中,请尝试确保您传入的日期确实被解释为日期:

SELECT 
  * 
FROM 
  table_b b 
  INNER JOIN 
  table_a a 
    on b.Table_ID = a.ID 
WHERE 
  a.date > CONVERT(datetime , '20161231' , 112 )

我怀疑SQLSERVER正在将您的约会12/31/16解释为"十二分为三十一除以十六" - 浮点数约为0.0241935

在内部处理日期的方式,它们可以转换为浮点数,表示自某个时间点以来的天数(和分数),我相信1900年1月1日。因此,你的0.024浮点数代表一个日期在1900年1月1日午夜过后约35分钟..这就是为什么你的结果没有过滤,因为所有日期都满足where子句(它们都晚于01-01-1900 00:35)!

答案 1 :(得分:0)

请测试下面的脚本,它可能会给你预期的输出。

Select * 
from Table_B b 
    inner join Table_A a 
        on b.Table_ID = a.ID 
        and date > convert(date , '20161231' , 112 )

答案 2 :(得分:0)

您对当前实施的结果是什么,因为我没有看到您当前查询的任何问题

答案 3 :(得分:-1)

Select * 
from Table_B b 
inner join Table_A a 
  on b.Table_ID = a.ID 
  where date > '12/31/16'

您可以尝试在日期中使用引号。

或者最好的方法是使用

Select * 
from Table_B b 
inner join Table_A a 
  on b.Table_ID = a.ID 
  where Date BETWEEN '12/31/2016' and '1/1/2018'