有一种SQL方法可以从一个数据库中选择日期为今天的日期记录,日期为两年的倍数。从数据库中选择日期,其中日期是今天和多个
例如,我有一个表格调用“列表”。该表有两列“ID”和“last_date”。其中一个记录是:ID ='1'和日期= '17 -03-2015'
我需要选择所有记录,其中日期是表+ 2年的日期。例如今天查询将返回ID 1.
感谢所有。
有一种SQL方法可以从一个数据库中选择日期为今天的日期记录,日期为两年的倍数。从数据库中选择日期,其中日期是今天和多个
例如,我有一个表格调用“列表”。该表有两列“ID”和“last_date”。其中一个记录是:ID ='1'和日期= '17 -03-2015'
我需要选择所有记录,其中日期是表+ 2年的日期。例如今天查询将返回ID 1.
感谢所有。
使用DATE_SUB()
从今天的日期减去2年,并将其与列进行比较。
SELECT id
FROM list
WHERE last_date = DATE_SUB(CURDATE(), INTERVAL 2 YEAR);
这比@ Teja公司的解决方案更好一点,因为它只有做日期计算一次,而不是为表中的每一行。如果last_date
列中有一个索引,它将能够使用它快速查找行。
我们可以写一个返回日期值是今天的日期正好前两天表现:
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
@ShawnMehan他正在寻找一个特定的日期,而不是范围。它是MySQL,而不是T-SQL。 – Barmar
在编写查询方面,'last_date'列的数据类型* *('DATE','DATETIME','VARCHAR')是一样的列名*一样重要。 (MySQL'DATE'的标准格式中的示例值'* 17 -03-2015'*为* not *,这暗示该列可能不会被声明为'DATE'。) – spencer7593