【问题标题】:SQL Join Two Tables With Two Common Columns - Datetime IssueSQL 用两个公共列连接两个表 - 日期时间问题
【发布时间】:2020-07-26 20:56:40
【问题描述】:

我正在尝试加入两个 SQL 表。

表1:

Date                             |        Name       |        Shoe_Size     |     Pay_method
2020-04-04 05:27:00.0000000      |    J.Bloggs       |         8            |      Credit
2020-04-04 05:55:00.0000000      |    J.Smith        |         10           |      Cash
2018-06-20 05:27:00.0000000      |    J.Bloggs       |         6            |      Cash
2018-08-15 05:55:00.0000000      |    J.Smith        |         9            |      Cash

表2:

Date_ID                             |        Name       |        TShirt_Size 
2020-04-04 00:00:00.0000000         |    J.Bloggs       |         M
2020-04-04 00:00:00.0000000         |    J.Smith        |         L
2018-06-20 00:00:00.0000000         |    J.Bloggs       |         S
2018-08-15 00:00:00.0000000         |    J.Smith        |         M

我想合并表格来展示:

 Date                            |        Name       |       Shoe_Size    |  TShirt_Size
2020-04-04 05:27:00.0000000      |    J.Bloggs       |         8          |       M
2020-04-04 05:55:00.0000000      |    J.Smith        |         10         |       L
2018-06-20 05:27:00.0000000      |    J.Bloggs       |         6          |       S
2018-08-15 05:55:00.0000000      |    J.Smith        |         9          |       M

我试过的代码:

SELECT a.Date, a.Name, a.Shoe_Size, b.DATE_ID, b.Name, b.Tshirt_Size
From Table1 a, Table2.b
WHERE a.Name = b.Name

但显然没有考虑日期维度。

我不确定如何获得的东西:

  1. 如何根据两个常用列(名称和日期)进行连接。

  2. 表 1 中的日期具有准确的时间,而表 2 中的日期恰好具有正确的日期。每个名字每天只有一个条目。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql date join


    【解决方案1】:

    试试这个 - 使用 正确 ANSI JOIN,并单独比较 日期(无时间部分):

    SELECT 
        a.Date, a.Name, a.Shoe_Size, b.Name, b.Tshirt_Size
    FROM 
        Table1 a
    INNER JOIN 
        Table2 b ON a.Name = b.Name
                 AND CAST(a.Date AS DATE) = CAST(b.Date_ID AS DATE)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT a.Date, a.Name, a.Shoe_Size, b.DATE_ID, b.Name, b.Tshirt_Size
      From Table1 a
      INNER JOIN Table2.b
          ON a.Name = b.Nam
          AND CONVERT(VARCHAR(10),a.Date, 121) = CONVERT(VARCHAR(10), b.date, 121)
      

      【讨论】:

      • 非常感谢。我尝试了上面的那个并且它有效,所以我去了!
      【解决方案3】:

      我愿意:

      select
          t1.date,
          t1.name,
          t1.shoe_size,
          t2.tshirt_size
      from table1 t1
      inner join table2 t2 
          on  t1.name = t2.Name
          and t1.date >= t2.date
          and t1.date <  dateadd(day, 1, t2.date)
      

      这种方法的好处是,不会对来自 table1 的日期应用日期函数 - 我希望这比本列中涉及日期函数的其他解决方案具有更好的性能。

      【讨论】:

      • 非常感谢,事实上这两种解决方案都有效,非常感谢它
      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      相关资源
      最近更新 更多