【问题标题】:How to select all id's that are within one year prior to a date on a second table?如何选择第二张桌子上日期前一年内的所有ID?
【发布时间】:2014-01-05 17:47:29
【问题描述】:

我有两个包含数千个条目的表。我只对第二个表中日期之前一年内的 id 感兴趣。我正在使用的一个小例子如下...
第一个看起来像这样:

table A
id test date
1  b    12/28/2009
4  c    12/03/2006

第二个表格如下所示:

table B
id date
1  2/03/2010
4  3/12/2008

我想从第一个表中检索在表二日期之前一年内的所有 id。因此,例如在这种情况下,将选择 id 1 但不会选择 id 4。到目前为止,这是我尝试过的代码。

Select * FROM A,B 
WHERE (A.id = B.id AND A.date BETWEEN B.date-INTERVAL 1 YEAR AND B.date);

当我运行这个查询时,我得到一个空集。有人可以解释一下我做错了什么以及我应该怎么做才能让它正常工作吗?

【问题讨论】:

  • 您的查询看起来正确。我将您的数据插入到测试数据库中,它只返回 1 行。日期列的数据类型是什么?
  • @Galz,在两个表中都是 varchar。我是否需要更改数据类型才能正常工作?如果是这样,有没有一种简单的方法可以做到这一点?或者有没有办法在不改变数据类型的情况下做到这一点?
  • varchar 是存储日期的不好方法。要对 varchar 执行日期计算,您需要在进行任何计算之前将其转换为日期...要将 varchar 列转换为日期列,请参阅:stackoverflow.com/questions/14378003/…
  • 你的语法看起来有点奇怪。你能试试这个吗? Select * FROM A,B WHERE (A.id = B.id AND A.date BETWEEN DATE_ADD(B.date, INTERVAL -1 YEAR) AND B.date);
  • @Galz,谢谢,我会检查一下。我刚刚读到它是一种在其他线程中存储日期的不好方法。我正在处理在我之前设置的数据,并且对此也相当陌生。感谢您的帮助。

标签: mysql date


【解决方案1】:

如果您必须保持表结构不变,这将起作用:

SELECT * 
FROM a
JOIN b ON a.id = b.id
WHERE STR_TO_DATE(a.date, '%m/%d/%Y') 
BETWEEN STR_TO_DATE(b.date, '%m/%d/%Y') - INTERVAL 1 YEAR 
AND STR_TO_DATE(b.date, '%m/%d/%Y');

否则,请阅读此线程以将日期从 varchar 转换为日期: Convert varchar column to date in mysql at database level

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多