簡體   English   中英

生日查詢所需的SQL幫助

[英]SQL help needed for birthday query

我有一個名為“用戶”的表。 在用戶內部,共有3列:ID,名稱,生日(例如:'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年是距今時今日的第一個leap年。 因此,如果記錄中的年份是2012年到2007年之間,則上面的查詢應該有所不同,以便工作並顯示生日人員的ID:

SELECT id FROM users WHERE timestampdiff(day, birth_date, now()) % 365 = 1;

因此,每隔4年,這個數字就會增加。

問題是:是否可以在強制轉換函數內部連接字符串並在timestampdiff內部使用強制轉換? 第一個查詢將嘗試替換birth_date記錄中的年份。 這是需要避免模數結果的leap年差異,使其保持為0。在此先感謝!

問:是否可以在強制轉換函數內部連接字符串並在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'

或與從今天開始的7天匹配:

 WHERE DATE_FORMAT( birth_date ,'%m-%d') = DATE_FORMAT( NOW() + INTERVAL 7 DAY ,'%m-%d')

為什么不使用間隔時間? 而且,盡管它看起來很復雜,但是如果您不對數據索引運行函數,則可以在查詢執行中使用它。

SQL小提琴

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);

結果

| 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 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM