在处理数据的时候,类似于消费订单数据时,总是会有一些对日期的操作,那么在Mysql中如何对日期类型数据进行操作呢。
Mysql的日期数据格式类型
Date类型 格式:YYYY-MM-DD
对于Date类型数据可以使用的函数:
year(column)
:返回YYYY的年数据month(column)
:返回MM的月份数据day(column)
:返回DD的日期数据date_add(column,INTERVAL expr unit)
:unit是加减的单位 可以是 year,month,week,day,hour,secondDATE_FORMAT(date, format)
: 将日期按照指定的格式返回字符串。- 例子:
DATE_FORMAT('2024-08-02', '%Y年%m月%d日')
返回 ‘2024年08月02日’
- 例子:
DATEDIFF(date1, date2)
: 返回两个日期之间的天数差。- 例子:
DATEDIFF('2024-08-02', '2024-07-01')
返回 32
- 例子:
2024-09-02更新datediff()函数
今天遇到一个问题,看题解的时候发现,为什么使用以下sql返回的数据和我预期的不太一样
with tmp as (
select visited_on,sum(amount) as amount
from Customer
group by visited_on
)
select * from
tmp a,
tmp b
WHERE DATEDIFF(a.visited_on,b.visited_on) between 0 and 6
order by a.visited_on,b.visited_on asc
我预期的:既然是a,b的笛卡尔积,使用WHERE DATEDIFF(a.visited_on,b.visited_on) between 0 and 6
筛选的不就是当天相差0-6天的天组合嘛,但是我也意识到,如果前后都相差6天岂不是会返回算上自身共计13天的组合,所以datediff绝对不是我预期的用法
果然,datediff(day1,day2)返回的是day1-day2的天数差,是可以为复数的!!!不是取绝对值!!!
这下,我就理解为什么这个筛选可以解决统计从开始日期统计连续7天的金额总计、平均了,只需要在这一步之后加一个count()就可以解决连续xx天的问题。
ADDDATE(date, interval)
: 相当于DATE_ADD()
,添加指定的间隔到日期。- 例子:
ADDDATE('2024-08-02', INTERVAL 1 MONTH)
返回 ‘2024-09-02’
- 例子:
SUBDATE(date, interval)
: 从日期中减去指定的间隔。- 例子:
SUBDATE('2024-08-02', INTERVAL 1 DAY)
返回 ‘2024-08-01’
- 例子:
CURDATE()
: 返回当前的日期。NOW()
: 返回当前的日期和时间。CURRENT_DATE
: 与CURDATE()
相同。CURRENT_TIME
: 返回当前的时间。CURRENT_TIMESTAMP
: 返回当前的日期和时间。STR_TO_DATE(string, format)
: 将字符串按照指定的格式转换为日期。- 例子:
STR_TO_DATE('02/08/2024', '%d/%m/%Y')
返回 ‘2024-08-02’
- 例子:
CONVERT_TZ(date, from_tz, to_tz)
: 将日期从一个时区转换到另一个时区。UNIX_TIMESTAMP(date)
: 将日期转换为UNIX时间戳。FROM_UNIXTIME(unix_timestamp)
: 将UNIX时间戳转换回日期。TIMESTAMPDIFF(unit, date1, date2)
: 返回两个时间戳之间的差异,unit
可以是SECOND
,MINUTE
,HOUR
,DAY
,WEEK
,MONTH
,QUARTER
,YEAR
。DATE_ADD(date, INTERVAL expr unit)
: 向日期添加一个时间间隔。