【问题标题】:Left join on month and year (not date) in SQL在 SQL 中的月份和年份(不是日期)左连接
【发布时间】:2021-07-09 16:35:10
【问题描述】:

我正在尝试使用以下代码将 2 个数据集的 ID 和 SQL 中的日期字段连接起来

CREATE TABLE new_data
SELECT A.*, B.`number`, B.`level`
FROM data1 AS A 
LEFT JOIN data2 AS B 
ON A.ID=B.ID
AND A.date=B.join_date

但是,他们应该加入的日期并不完全相同,所以我希望加入的日期只是月份和年份,而不是日期。日期的格式为 0000-00-00。但是是varchar。

谢谢

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。此外,样本数据和期望的结果也会有所帮助。

标签: sql date join


【解决方案1】:

从语法上我猜你使用的是 MariaDB 或 MySQL。如果是这种情况,您可以在连接谓词中使用SUBSTRING()

例如,如果您需要使用列的前 7 个字符进行连接,您可以这样做:

CREATE TABLE new_data
SELECT A.*, B.`number`, B.`level`
FROM data1 AS A 
LEFT JOIN data2 AS B 
  ON A.ID=B.ID
 AND substring(A.date, 1, 7) = substring(B.join_date, 1, 7)

【讨论】:

    【解决方案2】:

    在您可以使用子字符串之前回答“The Impaler”,但如果您想将它与任何 nvarchar 结构一起使用,只更改数字而不计算字符串上的字符,那么您可以使用 convert() 并指定日期转换的样式/格式。

    我将把描述 convert() sql 函数的所有样式/格式的链接放在这里: Convert() SQL Function Definition

    所以,你说你的 nvarchar 结构如下:'0000-00-00',那么你必须使用 102 样式/格式作为第三个参数,并在你的 convert() sql 函数中将数据类型设置为日期.

    一个例子:

    select * from #T01 as T1
    left join #T02 as T2 ON T1.ID = T2.ID
    WHERE YEAR(CONVERT(DATE,t1.DATE1,102)) = YEAR(CONVERT(DATE,t2.DATE2,102))
    AND MONTH(CONVERT(DATE,t1.DATE1,102)) = MONTH(CONVERT(DATE,t2.DATE2,102))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多