我有一个名为' users'的表。内部用户有3列:id,name,birth_date(例如:' 2015-10-25')。
我想创建一个查询,返回今天有生日的用户的ID。 所以我提出了:
SELECT id FROM users WHERE timestampdiff(day, cast(('2015' + '-' + extract(month from date) + '-' + extract(day from date)) as date), now()) % 365 = 0;
这不起作用,但这是:
SELECT id FROM users WHERE timestampdiff(day, birth_date, now()) % 365 = 0;
**这是有效的,因为记录中的年份是2015年,这比2012年还要大,这是第一个远离现在的闰年。因此,如果记录中的年份在2012年到2007年之间,则上述查询应该是不同的,以便工作并显示生日人的ID:
SELECT id FROM users WHERE timestampdiff(day, birth_date, now()) % 365 = 1;
因此,每增加4年,数字就会增加。
问题是:是否可以在强制转换函数中连接字符串并在timestampdiff中使用强制转换? 第一个查询将尝试替换birth_date记录中的年份。这需要避免模数结果的闰年差异,以保持0。 提前致谢!
答案 0 :(得分:1)
问:是否可以在强制转换函数中连接字符串并在timestampdiff中使用强制转换?
答:是的,可以在该上下文中执行字符串连接。 (但我无法理解为什么需要解决你报告的问题。)
在MySQL中,使用 CONCAT
函数执行字符串连接, +
运算符是数字加法运算符。但同样,我不知道你为什么要进行字符串连接。
如果你想取代"年" birth_date值的一部分,你可以使用这样的表达式:
CONCAT('2016-',DATE_FORMAT( birth_date ,'%m-%d'))
假设birth_date
列是DATE
数据类型,那么您可以使用类似的方法将日期值格式化为一致的"月份"格式,可以比较。
WHERE DATE_FORMAT( birth_date ,'%m-%d') = DATE_FORMAT( NOW() ,'%m-%d')
您还可以检查与特定日期匹配的birth_date
值:
WHERE DATE_FORMAT( birth_date ,'%m-%d') = '01-17'
或者那天与今天七天相匹配:
WHERE DATE_FORMAT( birth_date ,'%m-%d') = DATE_FORMAT( NOW() + INTERVAL 7 DAY ,'%m-%d')
答案 1 :(得分:0)
为什么不使用一年的间隔?而且,虽然它可能看起来很复杂,但如果您不在数据索引上运行函数,则可以在查询执行中使用。
MySQL 5.6架构设置:
CREATE TABLE users
(`id` int, `name` varchar(3), `birth_date` datetime)
;
INSERT INTO users
(`id`, `name`, `birth_date`)
VALUES
(1, 'apm', '1985-01-18 00:00:00'),
(1, 'bpm', '1955-01-18 00:00:00'),
(1, 'cpm', '1955-01-19 00:00:00')
;
查询1 :
select
users.*
, date_sub(curdate(), INTERVAL concat(year(curdate()) - year(birth_date),'') YEAR) as calc_date
from users
where birth_date = date_sub(curdate(), INTERVAL concat(year(curdate()) - year(birth_date),'') YEAR);
<强> Results 强>:
| id | name | birth_date | calc_date |
|----|------|---------------------------|---------------------------|
| 1 | apm | January, 18 1985 00:00:00 | January, 18 1985 00:00:00 |
| 1 | bpm | January, 18 1955 00:00:00 | January, 18 1955 00:00:00 |