MySQL:在MySQL中实现toStartOfQuarter和toStartOfWeek等函数

在 MySQL 中实现 ClickHouse 日期函数:toStartOfYear/toStartOfQuarter/toStartOfMonth/toMonday/toStartOfWeek

探索在 MySQL 中实现 ClickHouse 的以下函数。

ClickHouse 日期函数描述实现难度
toStartOfYear将 Date 或 DateTime 向前取整到本年的第一天。 返回 Date 类型。⭐️
toStartOfQuarter将 Date 或 DateTime 向前取整到本季度的第一天。 返回 Date 类型。⭐️⭐️⭐️
toStartOfMonth将 Date 或 DateTime 向前取整到本月的第一天。 返回 Date 类型。⭐️
toMonday将 Date 或 DateTime 向前取整到本周的星期一。 返回 Date 类型。⭐️⭐️
toStartOfWeek(t[,mode])按 mode 将 Date 或 DateTime 向前取整到最近的星期日或星期一。 返回 Date 类型。 mode 参数的工作方式与 toWeek() 的 mode 参数完全相同。 对于单参数语法,mode 使用默认值 0。⭐️⭐️

toStartOfYear

SELECT DATE_FORMAT(date, '%Y-01-01')

toStartOfQuarter

SELECT DATE_ADD(DATE_FORMAT(date,'%Y-01-01'),INTERVAL CEIL((DATE_FORMAT(date,'%m')/3))-1 QUARTER)

思路分析:

向前取本季度的第一天,可以通过本年第一天加季度数得到,季度数可以通过月份/3得到。

步骤倒推:

  1. DATE_ADD(DATE_FORMAT(date,'%Y-01-01'),INTERVAL 【季度】 QUARTER)
    

    基准点取本年第一天,通过加 [0,3] 个季度得到以下效果:YYYY-01-01/YYYY-04-01/YYYY-07-01/YYYY-10-01,分别表示一季度、二季度、三季度、四季度。

    也就是说接下来的 SQL 我们要考虑如何通过 Date 转换出 [0,3]。

  2. CEIL((DATE_FORMAT(date,'%m')/3))-1
    

    这里我们通过月份转换出季度,转换规则为 [1,3]/[4,6]/[7,9]/[10,12] 转为 0/1/2/3。

toStartOfMonth

SELECT DATE_FORMAT(date, '%Y-%m-01')

toStartOfWeek/toMonday

SELECT DATE_ADD(DATE_FORMAT(date,'%Y-01-01'),INTERVAL DATE_FORMAT(date, '%u') WEEK)    -- 每周第一天是周日
SELECT DATE_ADD(DATE_FORMAT(date,'%Y-01-01'),INTERVAL DATE_FORMAT(date, '%u')*7-6 DAY) -- 每周第一天是周一

思路分析:

向前取本周第一天,可以通过本年第一天加周数得到,也可以通过本年第一天加天数得到。后者在改变每周第一天是周几方面比较灵活。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值