Mysql 获取日期和时间

文章介绍了在MySQL中获取日期、时间、时间戳的方法,以及使用CASE语句进行条件判断,COALESCE处理NULL值的操作。同时,展示了如何通过SQL查询找出用户的连续登录情况,包括基础方法和优化后的解决方案,涉及到了窗口函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql 获取日期和时间

获取日期

select current_date from table;

获取时间

select current_time from table;

获取时间戳(日期+时间)

select current_timestamp from table;

或者(获取现在时间)

select now() from table;

获取从时间列中年份

select extract(year from '列名') from table;

当前日期加上 1 天

select current_date + interval 1 day from table;

计算日期差

select datediff(day, current_date, date '2019-01-01') from table;
简单 case
select '性别',
case '性别'
	when '男' then 1
	when '女' then 0
	else null
end
from table
搜索 case
select salary,
case 
	when salary < 5000 then 'Low'
	when salary < 10000 then 'Middle'
	else 'Top'
end as salary_level
from table
coalesce(x, y)

若x为null,则返回y,否则返回 x

select salary,
	coalesce(salary, 0)
from table
连续登录

可以看这位大佬的视频:

首先筛选得到新表,然后去重(一天内有多次登录,只保留一次)

select distinct uid, date(login_time) as ymd
from t_login
where login_time between timestamp '2022-01-01 00:00:00' and timestamp '2022-01-31 23:59"59';

连续两天登录(简单暴力解法,连续多少天就后面继续接)

SELECT  t1.uid, t1.ymd, t2.ymd
FROM  (SELECT DISTINCT uid, date(login_time) as ymd
FROM t_login
WHERE login_time BETWEEN timestamp '2022-01-01 00:00:00' AND timestamp '2022-01-31 23:59"59') t1
JOIN  (SELECT DISTINCT uid, date(login_time) as ymd
FROM t_login
WHERE  login_time BETWEEN timestamp '2022-01-01 00:00:00' AND timestamp '2022-01-31 23:59"59') t2
ON (t1.uid = t2.uid AND datediff(t2.ymd, t1.ymd)=1);

使用窗口函数可以得到排序,日期减去天数(num),若得到日期一样,则为连续

WITH t1 AS (SELECT DISTINCT uid, date(login_time) as ymd
FROM t_login
WHERE login_time BETWEEN timestamp '2022-01-01 00:00:00' AND timestamp '2022-01-31 23:59"59') 
SELECT uid, ymd, ROWNUMBER() OVER (PARTITION BY uid ORDER BY ymd) num,
				date_sub(ymd,  INTERVAL  ROW_NUMBER()  OVER  (PARTITION  BY  uid  ORDER  BY  ymd)  day)  sub_date
FROM t1;
改进1
WITH t1 AS (SELECT DISTINCT uid, date(login_time) as ymd
FROM t_login
WHERE login_time BETWEEN timestamp '2022-01-01 00:00:00' AND timestamp '2022-01-31 23:59"59') 
t2 AS (
SELECT uid, ymd, 
				date_sub(ymd,  INTERVAL  ROW_NUMBER()  OVER  (PARTITION  BY  uid  ORDER  BY  ymd)  day)  sub_date
FROM t1)
SELECT  uid, min(ymd),  max(ymd), count($*$)
FROM  t2
GROUP BY  uid,  sub_date
HAVING count($*$)>=3;  (连续登录三天以上)
改进2
WITH t1 AS (SELECT DISTINCT uid, date(login_time) as ymd
FROM t_login
WHERE login_time BETWEEN timestamp '2022-01-01 00:00:00' AND timestamp '2022-01-31 23:59"59') 
t2 AS(
SELECT uid, ymd, 
				datediff(ymd, lag(ymd, 2)  OVER  (PARTITION  BY  uid  ORDER  BY  ymd))  diff
FROM t1)
SELECT uid,  date_sub(ymd, INTERVAL  2  DAY)  min_date,  ymd
FROM  t2
WHERE  diff = 2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值