[英]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')
為什么不使用間隔時間? 而且,盡管它看起來很復雜,但是如果您不對數據索引運行函數,則可以在查詢執行中使用它。
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.