惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
小众软件
小众软件
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
H
Help Net Security
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
博客园 - 司徒正美
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
腾讯CDC

博客园 - lzhdim

25个每个开发人员都应该掌握的JavaScript 数组方法 20260831 - 个人小作品更新 C#使用SQLite数据库例子 - 开源研究系列文章 20260830 - 个人小作品更新 20260829 - 个人小作品更新 13、JavaScript事件循环机制 - JavaScript学习系列文章 首款媲美分体水冷的一体水冷!微星CORELIQUID E15 360水冷散热器评测:目前为止 锐龙9 9950X3D最强性能释放 JavaScript常见的内存泄露问题 - JavaScript学习系列文章 C#开发的颜色取色器 - 开源研究系列文章 - 个人小作品 成长环境 - 我的闪存 提高 SQL 语句执行速度的方法 JavaScript安全最佳实践 关闭iPhone一些默认设置,让iPhone更流畅 20260814 - 个人小作品更新 JavaScript对象与元编程 20260812 - 个人小作品更新 JavaScript 模块化系统 Markdown 语法完全指南 C# 通过 Windows API 实现进程内存读写操作 JavaScript 函数进阶课题 C#开发的基于钩子技术监测键鼠事件的例子 - 开源项目研究文章 JavaScript异步编程的演进 近十年最帅风冷!酷冷至尊V8 ACE 3DHP散热器评测:单塔能干翻双塔 20260723 - 个人小作品更新 C# 中读取CPU、硬盘和内存温度 雷柏VT3s MAX鼠标评测:中小手型用户也没有被遗忘 顶尖性能的小号电竞鼠标来了 JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册
SQL 入门 11:日期时间格式化、IF、CASE的使用
lzhdim · 2026-04-23 · via 博客园 - lzhdim

以下为 SQL 中日期格式化、时间计算及条件逻辑的用法解析。

学习内容

  1. 日期格式化
    • DATE_FORMAT(date, format):按指定格式显示日期。
    • 格式符:%y(两位年)、%M(月名)、%D(带后缀的日)等。

2. 时间格式化

  • TIME_FORMAT(time, format):按指定格式显示时间。
  • 格式符:%H(24 小时)、%i(分)、%S(秒)、%p(AM/PM)。

3. 时间与日期计算

  • DATE_ADD(date, INTERVAL n unit):添加时间间隔(如天、月、年),负值等效回溯。
  • DATE_SUB(date, INTERVAL n unit):减去时间间隔。
  • DATEDIFF(date1, date2):计算两日期天数差,较早日期视为小,输出正负值。
  • TIME_TO_SEC(time):将时间转为秒数,计算间隔时可相减。
  1. 空值处理
    • IFNULL(expr, replacement):若 expr 为空,返回 replacement。
    • COALESCE(expr1, expr2, ...):返回首个非空值。
  2. 条件逻辑
    • IF(condition, true_value, false_value):根据条件返回不同值。
    • CASE ... WHEN ... THEN ... END:多条件分支,WHEN 无需逗号,支持 ELSE。

示例代码与讲解

1. 日期格式化

SELECT DATE_FORMAT(NOW(), '%y');

  • 返回两位年份,如 '25'。

SELECT DATE_FORMAT(NOW(), '%M %y');

  • 返回月名和两位年份,如 'April 25'。

SELECT DATE_FORMAT(NOW(), '%M %D %y');

  • 返回月名、带后缀日和年份,如 'April 15th 25'。

2. 时间格式化

SELECT TIME_FORMAT(NOW(), '%H');

  • 返回 24 小时格式,如 '15'。

SELECT TIME_FORMAT(NOW(), '%H:%i %S');

  • 返回小时、分、秒,如 '15:02:23'。

SELECT TIME_FORMAT(NOW(), '%H %i %S %p');

  • 返回带 AM/PM,如 '03 02 23 PM'。

3. 时间与日期计算

SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);

  • 当前时间加 1 天。

SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);

  • 加 1 月。

SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR);

  • 加 1 年。

SELECT DATE_ADD(NOW(), INTERVAL -1 DAY);

  • 减 1 天,等效 DATE_SUB。

SELECT DATEDIFF('2002-04-19', '2001-06-19');

  • 返回 304 天(正值)。

SELECT DATEDIFF('2001-06-19', '2002-04-19');

  • 返回 -304 天(负值)。

SELECT TIME_TO_SEC('9:01');

  • 返回 9:01 的秒数 32460。

SELECT TIME_TO_SEC('19:01') - TIME_TO_SEC('18:09');

  • 返回时间差 3120 秒。

4. 空值处理

SELECT order_id, IFNULL(shipper_id, 'Not assigned') AS shipper
FROM orders;

  • shipper_id 为空时返回 'Not assigned'。

SELECT order_id, COALESCE(shipper_id, comments, 'Not assigned') AS shipper
FROM orders;

  • 返回首个非空值:shipper_id、comments 或 'Not assigned'。

5. 条件逻辑

SELECT order_id, order_date,
    IF(YEAR(order_date) = YEAR(NOW()), 'Active', 'Archived') AS Category
FROM orders;

  • 当前年订单标记 'Active',否则 'Archived'。

SELECT order_id,
    CASE
        WHEN YEAR(order_date) = YEAR(NOW()) THEN 'Active'
        WHEN YEAR(order_date) = YEAR(NOW()) - 1 THEN 'Last year'
        WHEN YEAR(order_date) < YEAR(NOW()) - 1 THEN 'Archived'
        ELSE '....'
    END AS Category
FROM orders;

  • 多条件分类:当前年 'Active',去年 'Last year',更早 'Archived'。

作业

1. 空值处理

SELECT CONCAT(first_name, ' ', last_name) AS Costomers,
    COALESCE(phone, 'Unknown') AS phone
FROM customers;

  • 合并姓名,电话为空时返回 'Unknown'。

2. IF 条件

SELECT product_id, name, COUNT(order_id) AS orders,
    IF(COUNT(order_id) > 1, 'Many times', 'Once') AS Frequery
FROM products
JOIN order_items USING (product_id)
GROUP BY product_id, name;

  • 统计产品订购次数,>1 次为 'Many times',否则 'Once'。

3. CASE 条件

SELECT CONCAT(first_name, ' ', last_name) AS Coustmers, points,
    CASE
        WHEN points < 1000 THEN 'C'
        WHEN points >= 1000 AND points < 2000 THEN 'B'
        WHEN points >= 2000 THEN 'A'
    END AS Category
FROM customers
ORDER BY points DESC;

  • 根据积分分级: <1000 为 'C',1000-1999 为 'B',≥2000 为 'A'。

总结

本次解析了日期与时间格式化(DATE_FORMAT、TIME_FORMAT)、时间计算(DATE_ADD、DATEDIFF)、空值处理(IFNULL、COALESCE)及条件逻辑(IF、CASE)。基于 sql_store 数据库。后续将探讨视图与存储过程。