大数据学习
系列专栏: 哲学语录: 用力所能及,改变世界。
如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博主哦
dayofweek(date)
SELECT dayofweek('2023-10-01'); -- 返回 1(星期日)
year(date)
/ month(date)
/ day(date)
SELECT year('2023-10-01'); -- 返回 2023
SELECT month('2023-10-01'); -- 返回 10
SELECT day('2023-10-01'); -- 返回 1
hour(time)
/ minute(time)
/ second(time)
SELECT hour('2023-10-01 14:30:45'); -- 返回 14
SELECT minute('2023-10-01 14:30:45'); -- 返回 30
SELECT second('2023-10-01 14:30:45'); -- 返回 45
weekofyear(date)
SELECT weekofyear('2023-10-01'); -- 返回 40(第40周)
dayofmonth(date)
/ dayofyear(date)
SELECT dayofmonth('2023-10-01'); -- 返回 1
SELECT dayofyear('2023-10-01'); -- 返回 274(10月1日是第274天)
datediff(enddate, startdate)
enddate - startdate
)。SELECT datediff('2023-10-10', '2023-10-01'); -- 返回 9
date_add(startdate, days)
/ date_sub(startdate, days)
SELECT date_add('2023-10-01', 7); -- 返回 '2023-10-08'
SELECT date_sub('2023-10-01', 3); -- 返回 '2023-09-28'
add_months(startdate, months)
SELECT add_months('2023-10-01', 3); -- 返回 '2024-01-01'
SELECT add_months('2023-10-31', 1); -- 返回 '2023-11-30'(自动处理月底)
months_between(enddate, startdate)
SELECT months_between('2023-12-01', '2023-10-01'); -- 返回 2.0
SELECT months_between('2023-10-15', '2023-10-01'); -- 返回 ~0.5
date_format(date, format)
yyyy-MM-dd
等格式)。SELECT date_format('2023-10-01', 'yyyy-MM-dd'); -- 返回 '2023-10-01'
SELECT date_format('2023-10-01', 'yyyy/MM/dd'); -- 返回 '2023/10/01'
SELECT date_format('2023-10-01', 'MM-dd-yyyy'); -- 返回 '10-01-2023'
from_unixtime(unix_timestamp [, format])
yyyy-MM-dd HH:mm:ss
)。SELECT from_unixtime(1696185600); -- 返回 '2023-10-01 00:00:00'
SELECT from_unixtime(1696185600, 'yyyy-MM-dd'); -- 返回 '2023-10-01'
unix_timestamp([date [, format]])
SELECT unix_timestamp('2023-10-01 00:00:00'); -- 返回 1696185600
SELECT unix_timestamp('2023/10/01', 'yyyy/MM/dd'); -- 返回 1696185600
current_date
yyyy-MM-dd
)。SELECT current_date; -- 返回执行时的日期,如 '2023-10-01'
current_timestamp
SELECT current_timestamp; -- 返回 '2023-10-01 14:30:45.123'
trunc(date, format)
SELECT trunc('2023-10-15', 'YEAR'); -- 返回 '2023-01-01'(年初)
SELECT trunc('2023-10-15', 'MONTH'); -- 返回 '2023-10-01'(月初)
last_day(date)
SELECT last_day('2023-10-01'); -- 返回 '2023-10-31'
SELECT last_day('2023-02-01'); -- 返回 '2023-02-28'(平年2月)
next_day(date, weekday)
weekday
为英文缩写,如 'MO'
、'TU'
)。SELECT next_day('2023-10-01', 'MO'); -- 返回 '2023-10-02'(下一个周一)
SELECT next_day('2023-10-01', 'SU'); -- 返回 '2023-10-08'(下一个周日)
from_utc_timestamp(timestamp, timezone)
SELECT from_utc_timestamp('2023-10-01 00:00:00', 'Asia/Shanghai'); -- 返回 '2023-10-01 08:00:00'
to_utc_timestamp(timestamp, timezone)
SELECT to_utc_timestamp('2023-10-01 08:00:00', 'Asia/Shanghai'); -- 返回 '2023-10-01 00:00:00'
日期格式要求:
yyyy-MM-dd
或 yyyy-MM-dd HH:mm:ss
格式。unix_timestamp()
或 date_format()
转换。版本差异:
date_format
),低版本可能需使用 from_unixtime
替代。性能建议:
WHERE
子句中对日期字段使用函数(如 WHERE year(date_col) = 2023
),会导致全表扫描。WHERE date_col >= '2023-01-01' AND date_col < '2024-01-01'
。WITH user_registration AS (
SELECT
user_id,
reg_date
FROM users
),
user_activity AS (
SELECT
user_id,
activity_date
FROM user_logs
)
SELECT
ur.user_id,
ua.activity_date,
DATEDIFF(ua.activity_date, ur.reg_date) AS days_since_reg,
CASE WHEN DATEDIFF(ua.activity_date, ur.reg_date) <= 7 THEN 1 ELSE 0 END AS is_active_within_7d
FROM user_registration ur
LEFT JOIN user_activity ua ON ur.user_id = ua.user_id;
SELECT
order_date,
COUNT(order_id) AS order_count
FROM orders
WHERE order_date = last_day(order_date)
GROUP BY order_date;