从数据库日期中选择日期为今天和多个

时间:2017-03-17 19:05:27

标签: mysql sql

有一种方法可以使用SQL从一个数据库中选择日期记录,其中日期是今天,日期是两年的倍数。

例如,我有一个表呼叫" list"。该表有两列,' ID'和' last_date'。其中一条记录是:ID =' 1'和日期=' 17-03-2015'

我需要选择所有记录,其中日期是表格上的日期+ 2年。例如,今天查询将返回ID 1。

感谢所有人。

2 个答案:

答案 0 :(得分:0)

使用DATE_SUB()从今天的日期开始减去2年,并将其与该列进行比较。

SELECT id
FROM list
WHERE last_date = DATE_SUB(CURDATE(), INTERVAL 2 YEAR);

这比@Teja的解决方案好一点,因为它只需要进行一次日期算术,而不是表格中的每一行。如果last_date列上有索引,则可以使用它快速查找行。

答案 1 :(得分:0)

我们可以编写一个表达式,该表达式返回的日期值恰好是今天日期的前两天:

 SELECT DATE(NOW()) + INTERVAL -2 YEAR 

我们可以在查询的WHERE子句中使用表达式。如果我们要检查的表中的列被定义为DATE数据类型:

 SELECT t.id
   FROM mytable t
  WHERE t.mydatecol = DATE(NOW()) + INTERVAL -2 YEAR 

如果它被定义为DATETIME,则正常模式将是范围检查

 SELECT t.id
   FROM mytable t
  WHERE t.mydatecol >= DATE(NOW()) + INTERVAL -2 YEAR 
    AND t.mydatecol  < DATE(NOW()) + INTERVAL -2 YEAR + INTERVAL 1 DAY

如果列以非规范格式存储为VARCHAR,例如DD-MM-YYYY然后我们可以尝试使用STR_TO_DATE将其转换为DATE(我们不喜欢这样做,因为查询无法有效地使用索引),或者我们可以将生成的日期值转换为相等比较所需的字符串格式:

 SELECT t.id
   FROM mytable t
  WHERE t.ddmmyyyy = DATE_FORMAT(DATE(NOW()) + INTERVAL -2 YEAR,'%d-%m-%Y')

这将使我们与'17 -03-2015'完全匹配,但不会与'17 -3-2015'相匹配。而且我们必须做相等测试或IN列表,我们不能做范围检查,因为存储在列中的值不是规范的。

如果我们需要查找多个日期......今天,两年前,四年前,六年前......我们可以生成日期列表并执行连接操作。 (假设mydatecol被定义为DATETIME ...)

 SELECT t.id
   FROM ( SELECT DATE(NOW()) + INTERVAL 0 YEAR AS dt
          UNION ALL SELECT DATE(NOW()) + INTERVAL -2 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -4 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -6 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -8 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -10 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -12 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -14 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -16 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -18 YEAR
          UNION ALL SELECT DATE(NOW()) + INTERVAL -20 YEAR
        ) l
   JOIN mytable t
  WHERE t.mydatecol >= l.dt + INTERVAL 0 DAY
    AND t.mydatecol <  l.dt + INTERVAL 1 DAY
相关问题