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

文章目录

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

在 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) -- 每周第一天是周一

思路分析:

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

你可能感兴趣的:(ClickHouse,MySQL,mysql,ClickHouse,toStartOf,日期函数)