生日查询需要SQL帮助

时间:2016-01-18 00:26:08

标签: mysql sql

我有一个名为' 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。 提前致谢!

2 个答案:

答案 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)

为什么不使用一年的间隔?而且,虽然它可能看起来很复杂,但如果您不在数据索引上运行函数,则可以在查询执行中使用。

SQL Fiddle

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 |