文章目录
- 在 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得到。
步骤倒推:
-
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]。
-
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) -- 每周第一天是周一
思路分析:
向前取本周第一天,可以通过本年第一天加周数得到,也可以通过本年第一天加天数得到。后者在改变每周第一天是周几方面比较灵活。