【mysql】获取指定日期是当年第几周,指定日期所在周的开始和结束日期
描述
最近在刷mysql的題目,遇到指定日期是當年第幾周的問題。
解決
0、總結
先總結,具體使用和區別看下文:
# 一、返回第幾周 select date_format('2023-01-01','%v') # 返回52,字符樣式是小寫,星期一是一周的第一天,# 2023年的新的星期還沒開始,# 返回了2022年的第52周,實際上是2023年的第0周 select date_format('2023-01-01','%V') # 返回01,大寫,星期天是一周的第一天 select week('2023-01-01', 0) # 返回1,這里week函數的第二個參數[0,1,2]的區別在下文提到 select week('2023-01-01', 1) # 返回0 select week('2023-01-01', 2) # 返回1 # 二、返回一周開始和結束 # 1、星期日為一周的開始 select date(now()) as date, date(subdate(now(), date_format(now(), '%w'))) as weekStart,date(subdate(now(), (date_format(now(), '%w')-6))) as weekEnd;# 2、星期一為一周的開始 select date(now()) as date,date(subdate(now(), (date_format(now(), '%w')+6)%7)) as weekStart,date(subdate(now(), (date_format(now(), '%w')-7)%7)) as weekEnd1、返回第幾周
方法1:使用date_format函數
select date_format('2023-01-01','%v') #返回52,小寫,星期一是一周的第一天,2023年的新的星期還沒開始,返回了2022年的第52周,實際上是2023年的第0周 select date_format('2023-01-01','%V') #返回01,大寫,星期天是一周的第一天第二個參數的字符樣式:
凡是與周有關的樣式
小寫的為星期一是一周的第一天;大寫的都為星期日是一周的第一天;(記憶:西方人基督教有禮拜日,耶穌為大(大寫))
方法2:使用week函數
select week('2023-01-01', 0) # 返回1 select week('2023-01-01', 1) # 返回0 select week('2023-01-01', 2) # 返回1代碼運行結果:
week()函數使用:
week(符合時間格式的要求的日期或字符串,模式[0,1,2])
當模式為0時,對照模式表可以得知其計算邏輯是:把星期日當做一周的第一天,且第一周是以2023年的第一個星期日開始的,且在2023年的第一個星期日前那些屬于2023年的天數都歸為第0周。而2023年1月1日剛好是2023年第一個星期日,所以返回的結果是1。
當模式為1時,對照模式表可以得知其計算邏輯是:把星期一當做一周的第一天,且1月1日到本年第一個周一的天數超過3天,則認定這幾天處于本年的第1周,若天數沒超過3天(不足4天),則認定這幾天處于本年的第0周。而2023年1月1日到第一個周一(2023年1月2日)只有1天。所以認定2023年1月1日屬于2023年的第0周,所以返回的結果為0。
當模式為2時,對照模式表可以得知其計算邏輯是:把星期日當做一周的第一天,且第一周是以該年的第一個星期日開始的,前面的日期都算作上年度的最后一周(而模式0則是把這幾天算作為第0周)。這里以2021年為例,2021年1月2日是2021年第一個星期日之前日期,所以認定這幾天屬于2020年的最后一周(2020年的第52周),所以select week('2021-01-02',3)返回的結果為52。
2、指定日期所在周的開始和結束日期
參考:mysql小知識:根據指定日期,獲取是當年第幾周,但是當指定日期為星期天時有bug,稍加修改符合要求
# 星期日為一周的開始 select date(now()) as date, date(subdate(now(), date_format(now(), '%w'))) as weekStart,date(subdate(now(), (date_format(now(), '%w')-6))) as weekEnd;# 星期一為一周的開始 select date(now()) as date,date(subdate(now(), (date_format(now(), '%w')+6)%7)) as weekStart,date(subdate(now(), (date_format(now(), '%w')-7)%7)) as weekEndsubdate函數用法:
??subdate(當前日期,指定天數),日期的減法,返回當前日期-指定天數的日期,
??如select subdate('2022-06-26',3)返回的是2022-06-23,因為2022-06-26-3=2022-06-23
結果示例:
星期日為一周的開始
星期一為一周的開始
總結
以上是生活随笔為你收集整理的【mysql】获取指定日期是当年第几周,指定日期所在周的开始和结束日期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Strust2漏洞汇总
- 下一篇: 如何利用OMIM数据库获取肿瘤相关所有突