當目前為止呢,個人對Mysql的函數沒有進行過統一的學習使用,都是用到了再去學習。而近日開始學習Linux了,所以為了防止這段時期結束後,將此階段期間遇到的Mysql函數遺忘,開始在此對其做一個簡單的記錄。 昨天下班前朋友呢讓幫忙看一個sql,是關於生日提醒的,實際應用中呢是要實現提前一天提醒用戶生 ...
當目前為止呢,個人對Mysql的函數沒有進行過統一的學習使用,都是用到了再去學習。而近日開始學習Linux了,所以為了防止這段時期結束後,將此階段期間遇到的Mysql函數遺忘,開始在此對其做一個簡單的記錄。
昨天下班前朋友呢讓幫忙看一個sql,是關於生日提醒的,實際應用中呢是要實現提前一天提醒用戶生日,而sql呢是用來查詢後一天要過生日的用戶。在她原來的sql中用到了CONCAT、DATEDIFF函數,這兩個函數呢我自個兒呢之前是沒有用到過,所以在解決完問題之後在此記錄一下用法及思路。
首先,來看CONCAT和DATEDIFF函數的定義與用法:
CONCAT() : 用於連接兩個或多個字元串。如有任何一個參數為null,則返回值為null。
DATEDIFF():返回兩個日期之間的天數。
其次,來看需求:
查詢出相對當天,後一天要過生日的用戶。
在明確了需求和函數的用法之後我們來看思路:
1、既然是要查後一天要過生日的用戶,那我們可以簡單看作是查詢生日日期比當前日期大一天的用戶,那麼問題來了,這樣的話只能查詢到當前年、當前月份、當前日期後一天出生的用戶,顯然不符合,那再換種思路,假設所有用戶都在同一年出生,這樣我們獲取生日日期比當前日期大一天的用戶不就可以了^_^~
2、在1中我們可以看出,這樣看起來好像是沒什麼問題了,但是仔細想想,假如當前日期是12月31號,那後一天(也就是1月1號)過生日的用戶要是按照1的思路能查詢的到嗎?顯然不能。那我們再來看12月31號和1月1號,有沒有想到跨年呢,沒錯,就是跨年,既然這樣,我們將所有用戶生日日期年份替換成當前年跨年後的年份,這樣根據日期間天數為1的條件不就可以篩選出12月31號後一天過生日的用戶了嗎^_^~
最後,我們來看下sql的實現:
1、替換+組合生日日期:
替換生日日期年份為當前年:
CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,'-%m-%d'))
替換生日日期年份為當前年跨年後年份:
CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,'-%m-%d'))
2、處理後生日日期與當前日期間天數:
普通:
DATEDIFF(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,'-%m-%d')),NOW())
跨年:
DATEDIFF(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,'-%m-%d')),NOW())
3.整合,查詢當前日期後一天要過生日的用戶信息:
SELECT * FROM user WHERE DATEDIFF(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,'-%m-%d')),NOW()) = 1 OR DATEDIFF(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,'-%m-%d')),NOW()) = 1
最後:
DATEDIFF 函數中兩個參數,前一個比後一個大時,值>=0 ,前一個比後一個小時,值<=0
記錄完畢!