有一种方法可以使用SQL从一个数据库中选择日期记录,其中日期是今天,日期是两年的倍数。
例如,我有一个表呼叫" list"。该表有两列,' ID'和' last_date'。其中一条记录是:ID =' 1'和日期=' 17-03-2015'
我需要选择所有记录,其中日期是表格上的日期+ 2年。例如,今天查询将返回ID 1。
感谢所有人。
答案 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