背景:做報表,需要使用sql(Mysql數據庫)查出本週一到今日,以及上週一到上週日的數據。
問題:以週一爲第一天,選擇本週,獲取從週一到週日的數據。選擇上週,展示從上週一到上週天的的數據範圍。
過程描述:從網上查技術博客,很多人都是直接粘貼的,實際上根本沒考慮:如果當前爲周天,那麼獲取的本週一其實是明天的日期。這個原因是因爲mysql數據庫默認實用的日期規範是西方的,我國每週的第一天是從週一開始的,而西方是從周天開始的,所以,如果當前日期是周天,那麼獲取的本週週一,查出的結果是明天。
解決辦法:使用YEARWEEK(date,model)方法,這個方法是輸入一個日期,然後得出該日期在這一年的所在周,這個結果是可以直接進行比較的,比如本週的週三和週四進行比較,結果是相等的,所以可以用來查詢數據。那麼解決問題的辦法,是依賴YEARWEEK變更計算模式,使用:
YEARWEEK(DATE_FORMAT(create_date,'%Y-%m-%d'),1)
意思是 輸入 create_date,轉換成年月日的格式,然後通過模式1(指定每週的週一爲第一天),輸出年份和當前日期所在的週數。
接下來,就簡單了,進行比較:
YEARWEEK(DATE_FORMAT(create_date,'%Y-%m-%d'),1) = YEARWEEK(NOW(),1);
這個查的是,數據所在年份週數 等於 當前日期(不需要獲取周天的日期)所在的年份週數。
來一個完整的:
本週一到週日
SELECT * FROM task WHERE
YEARWEEK(DATE_FORMAT(create_date,'%Y-%m-%d'),1) = YEARWEEK(NOW(),1);
上週一到週日(當前所在周-1)
SELECT * FROM task WHERE
YEARWEEK(DATE_FORMAT(create_date,'%Y-%m-%d'),1) = YEARWEEK(NOW(),1)-1;