會員數(shù)據(jù)庫存儲了生日庶灿,如 1995年5月4日也搓。
需求:今天是2019年3月22日倘潜,要查詢10天內(nèi)漆际,或10到30天范圍內(nèi),或30到60范圍內(nèi)過生日的會員耸别。
問題:數(shù)據(jù)存儲的是日期格式健芭,帶年份的,直接比較肯定不行秀姐。
思路一:截取月日慈迈,如19950504 截取為 ‘0504’,跟當(dāng)前日期的月日 ‘0322’ 做字符串大小比較
思路二:將所有的生日的年份改為今年省有,然后做日期比較痒留。
以上兩個(gè)思路貌似沒啥問題谴麦,但是不夠嚴(yán)謹(jǐn),比如 12月30日伸头,我要查30天過生日的人匾效,應(yīng)該包括1月份生日的人,用以上兩種方法均查不出恤磷。
完美解決思路:
計(jì)算出生日那天是每年的第多少天也就是dayOfYear弧轧,各種語言都有對應(yīng)的函數(shù)可以獲取到dayOfYear 的值。冗余一個(gè)字段存儲這值也是個(gè)不錯(cuò)的選擇:dayOfYearBirth碗殷。
今天日期的dayOfYear,定義為 dayOfYearToday 速缨。對比這兩個(gè)值即可锌妻。
上一段代碼:
const moment = require('moment')
let birthdays = [
'1995-01-01',
'1989-02-21',
'1978-03-04',
'1979-04-10',
'1996-05-20',
'1985-10-11',
'1989-12-01',
'1990-04-23',
'1990-01-12',
]
let dayOfYearToday = moment().dayOfYear()
let start = 10;
let end = 20 // 10到20天內(nèi)過生日的
birthdays.forEach(birthday=>{
let dayOfYearBirth = moment(birthday).dayOfYear()
if (
//情況一,今年生日還沒到
(dayOfYearBirth - dayOfYearToday >= 0
// 減法得到生日還有多少天旬牲,是否在start仿粹,end范圍內(nèi)
&& dayOfYearBirth - dayOfYearToday <= end
&& dayOfYearBirth - dayOfYearToday>=start)
//另一個(gè)情況,今年生日已經(jīng)過了
|| ((dayOfYearBirth - dayOfYearToday) < 0
//看明年的生日是否在范圍內(nèi)原茅,這里的365不夠嚴(yán)謹(jǐn)吭历,可以判斷一下閏年情況,變成366
&& (dayOfYearBirth-dayOfYearToday+365)<=end
&& dayOfYearBirth-dayOfYearToday+365>=start)
)
{
console.log(birthday)
}
})
數(shù)據(jù)庫查詢也類似擂橘,寫成sql語句即可晌区。