TIMESTAMPDIFF函数和dateDiff函数分别是Mysql和 ClickHouse数据库的计算两个日期差值的函数,在项目中踩过坑,所以在此记录一下有共同点和异同点,避免今后继续踩坑。
注:这里 mysql的版本为8.0.25,clickhouse为20.12.5.14
一、相同:
- 1.1、都是计算日期差值的函数
- 1.2、都支持 年(year)、月(month)、日(day)、时(hour)、分(minute)、秒(second)、周(week)、刻钟(quarter) 的差值计算
二、不相同
- mysql的TIMESTAMPDIFF函数结果 是下取整,dateDiff函数结果是向上取整
三、例子
- mysql
/*目前版本为mysql8.0.25
* TIMESTAMPDIFF函数是将两个日期相减后得到精确的的时间差值,后下取整
*/
SELECT
/*计算 年份 这里两个日期差值大于0年但小于1年 结果为0*/
TIMESTAMPDIFF(YEAR,STR_TO_DATE(CONCAT('2020-11-01',' 00:00:00' ),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(CONCAT('2021-02-01',' 00:00:30' ),'%Y-%m-%d %H:%i:%s')) AS year,
/*计算 月份 这里两个日期差值大于1个月但未到2个月 结果为1*/
TIMESTAMPDIFF(MONTH,STR_TO_DATE(CONCAT('2021-01-21',' 00:00:00' ),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(CONCAT('2021-03-02',' 00:00:30' ),'%Y-%m-%d %H:%i:%s')) AS month,
/*计算 天 这里两个日期差值大于0天但未到1天 结果为0*/
TIMESTAMPDIFF(DAY,STR_TO_DATE(CONCAT('2021-01-01',' 10:00:00' ),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(CONCAT('2021-01-02',' 01:00:30' ),'%Y-%m-%d %H:%i:%s')) AS day,
/*计算 小时 这里两个日期差值大于1小时但未到1小时 结果为1*/
TIMESTAMPDIFF(HOUR,STR_TO_DATE(CONCAT('2021-01-01',' 00:40:00' ),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(CONCAT('2021-01-01',' 02:10:30' ),'%Y-%m-%d %H:%i:%s')) AS hour,
/*计算 分钟 这里两个日期差值大于1分钟但未到2分钟 结果为1*/
TIMESTAMPDIFF(MINUTE,STR_TO_DATE(CONCAT('2021-01-01',' 10:10:40' ),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(CONCAT('2021-01-01',' 10:12:12' ),'%Y-%m-%d %H:%i:%s')) AS minute,
/*计算 毫秒 这里两个日期差值 结果为-10*/
TIMESTAMPDIFF(SECOND,STR_TO_DATE(CONCAT('2021-01-01',' 00:00:40' ),'%Y-%m-%d %H:%i:%s'),STR_TO_DATE(CONCAT('2021-01-01',' 00:00:30' ),'%Y-%m-%d %H:%i:%s')) AS second;
- clickhosue
/*目前版本为clickhouse 20.12.5.14
* dateDiff函数是将两个日期相减后得到精确的的时间差值,后上取整
* */
SELECT
/*计算 年份 这里两个日期差值大于0年但小于1年 结果为1*/
dateDiff('year', toDateTime('2020-11-01 00:00:00'), toDateTime('2021-02-01 00:00:30')) AS year,
/*计算 月份 这里两个日期差值大于1个月但未到2个月 结果为2*/
dateDiff('month', toDateTime('2021-01-21 00:00:00'), toDateTime('2021-03-02 00:00:30')) AS month,
/*计算 天 这里两个日期差值大于0天但未到1天 结果为1*/
dateDiff('day', toDateTime('2021-01-01 10:00:00'), toDateTime('2021-01-02 01:00:30')) AS day,
/*计算 小时 这里两个日期差值大于1小时但未到1小时 结果为2*/
dateDiff('hour', toDateTime('2021-01-01 00:40:00'), toDateTime('2021-01-01 02:10:30')) AS hour,
/*计算 分钟 这里两个日期差值大于1分钟但未到2分钟 结果为2*/
dateDiff('minute', toDateTime('2021-01-01 10:10:40'), toDateTime('2021-01-01 10:12:12')) AS minute,
/*计算 毫秒 这里两个日期差值 结果为-10*/
dateDiff('second', toDateTime('2021-01-01 00:00:40'), toDateTime('2021-01-01 00:00:30')) AS second;
结果对比: