小木的学习日记-SQL函数-时间函数与字符串函数

    一  NOW() 用于SELECT

SELECT NOW();
可以获取当前的时间

  二 TIMESTAMPDIFF() 用于SELECT

TIMESTAMPDIFF

TIME(时间)
STAMP(戳记)
DIFFERENCE(差异)

所以TIMESTAMPDIFF函数的作用是计算时间差

SELECT name, TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age
FROM account_2c;

1 YEAR
一个参数,计算差值的整数,可以计算:

SECOND - 秒钟
MINUTE - 分钟
HOUR - 小时
DAY - 天
WEEK - 星期
MONTH - 月
QUARTER - 季度
YEAR - 年

2 birthday是之前的日期

3 NOW() 是现在的日期

三 CONCAT() 用于SELECT

作用:把多个列合并成一个列(一个函数,作用是将多个字符串连接为一个字符串。)

SELECT CONCAT(province,city,district,detailed_addr) AS 详细地址,recipient,contact_number
FROM address
WHERE account_id = 1004000054;

第一行代码通过SELECT关键字选择查找recipient,contact_number字段。

并用CONCAT关键字拼接province,city,district,detailed_addr四个字段取别名为详细地址。


第二行代码通过FROM关键字选择address表。


第三行代码通过WHERE关键字设置查询条件为account_id = 1004000054

四 SUBSTR -一般用于WHERE

也是筛选作用所以与WHERE放在一起

比如

SELECT COUNT(*)
FROM invoice
WHERE SUBSTR(express_number,1,2)="FT";
 

这一段代码的意思就是从invoice表中筛选出列为"express_number"中,从第一个字符串开始,向后面两个(包括第一个)是FT的所有符合要求的行的数据(COUNT(*))

比如举一个简单的例子

从invoice表中查找到运单前两个字母为SN(顺南)的运单总价,并重命名为订单总价。

SELECT SUM(fare) AS 订单总价
FROM invoice
WHERE SUBSTR(express_number,1,2)="SN";

第三行代码的作用就是查找运单(express_number)中前两个字母的SN的总价

那SUBSTR是不是只能再WHERE之后呢?

当然不是,其只是一个普遍规律而已。

要求:帮助公司找出客户的姓氏(此处以名字的第一个字为准),性别,和年龄。并将姓氏取名为"lastname",年龄取名为“age"。


SELECT SUBSTR(name,1,1) AS lastname,gender,TIMESTAMPDIFF(YEAR,birthday,NOW()) AS age
FROM account_2c;


姓氏-第一个字 涉及到准确位置的筛选我们就会想到 SUBSTR
然后还要进行换值--取名为"lastname"所以呢我们要将SUBSTR放在SELECT之中

然后就是获取gender,信息
以及通过TIMESTAMPDIFF函数获得时间差

简洁版:

SQL 核心函数实战指南:从时间处理到字符串操作

引言

在数据处理与分析中,SQL 函数是提升效率的利器。本文聚焦 NOW()、TIMESTAMPDIFF()、CONCAT()、SUBSTR() 四大高频函数,结合实战场景解析其用法,助你快速掌握数据清洗与报表生成技巧。

一、时间函数:NOW () 与 TIMESTAMPDIFF ()

1. NOW ():获取当前时间戳

  • 作用:返回数据库服务器的当前日期和时间(YYYY-MM-DD HH:MM:SS 格式)。
  • 语法

    sql

    SELECT NOW();  -- 输出:2025-06-03 14:30:00(示例)
    
  • 应用场景:动态生成时间戳(如订单创建时间默认值)。

2. TIMESTAMPDIFF ():计算时间差

  • 函数拆解TIME(时间) + STAMP(戳记) + DIFFERENCE(差异) → 时间戳差值计算。
  • 语法

    sql

    TIMESTAMPDIFF(unit, start_time, end_time)
    
     
    • unit:时间单位(SECOND/MINUTE/HOUR/DAY/WEEK/MONTH/YEAR 等)。
    • start_time/end_time:起始 / 结束时间(支持 NOW()、日期字符串或字段)。
  • 实战示例:计算用户年龄

    sql

    SELECT 
      name, 
      TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age  -- 生日到现在的年份差
    FROM account_2c;
    
  • 注意事项
    • 时间单位大小写不敏感(如 YEAR 与 year 等效)。
    • 结果为整数(自动取整,如 4.9 年 → 4 年)。

二、字符串拼接:CONCAT ()

1. 函数作用

将多个字符串或字段合并为一个字符串,支持 动态文本生成(如地址拼接、日志描述)。

2. 语法与示例

  • 基础拼接

    sql

    SELECT CONCAT(province, city, district, detailed_addr) AS 详细地址
    FROM address 
    WHERE account_id = 1004000054;
    

    (合并省、市、区、详细地址,生成完整地址)
  • 处理 NULL 值(MySQL 特性)

    sql

    SELECT CONCAT('用户:', name, ',余额:', COALESCE(balance, 0)) AS info  -- 余额为 NULL 时显示 0
    FROM users;
    
  • 拓展:CONCAT_WS ()(带分隔符拼接)

    sql

    SELECT CONCAT_WS('-', year, month, day) AS date  -- 用横线分隔年月日
    FROM calendar;
    

    (自动忽略 NULL 字段,仅在全 NULL 时返回 NULL)

3. 应用场景

  • 生成唯一标识(如 CONCAT(user_id, '_', order_id))。
  • 格式化输出(如 CONCAT('订单金额:', total_price, '元'))。

三、字符串截取:SUBSTR ()

1. 函数作用

从字符串中提取指定位置和长度的子串,支持 正向(从左到右) 和 反向(从右到左) 截取。

2. 语法解析

sql

SUBSTR(str, pos, len)  -- pos:起始位置(1-based),len:截取长度(可选,默认到末尾)

  • 正向截取

    sql

    SELECT SUBSTR('HelloWorld', 1, 5) AS first_5;  -- 输出:'Hello'
    
  • 反向截取(负数位置)

    sql

    SELECT SUBSTR('HelloWorld', -5) AS last_5;  -- 输出:'World'(从倒数第5位开始)
    

3. 实战案例

  • 提取姓氏(名字首字)

    sql

    SELECT 
      SUBSTR(name, 1, 1) AS lastname,  -- 取名字第一个字作为姓氏
      gender,
      TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age
    FROM account_2c;
    
  • 筛选运单前缀(WHERE 子句应用)

    sql

    SELECT SUM(fare) AS 订单总价
    FROM invoice 
    WHERE SUBSTR(express_number, 1, 2) = 'SN';  -- 运单前两位为“SN”
    

4. 注意事项

  • 位置索引从 1 开始(区别于 Python 的 0-based 索引)。
  • 越界处理:若 pos 超出字符串长度,返回空字符串。
  • 多场景支持:不仅限于 WHERE,也可用于 SELECT(如字段重组、数据脱敏)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值