文章目錄
- 在 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) -- 每周第一天是周一
思路分析:
向前取本周第一天,可以通過本年第一天加周數得到,也可以通過本年第一天加天數得到。后者在改變每周第一天是周幾方面比較靈活。