MySQL时间时区转换

-- 将timestamp转换为指定时区的时间,如:2018-09-21 11:48:42
select CONVERT_TZ(create_time, @@session.time_zone,'+8:00') from auth_user;

-- 将timestamp转换为指定时区的时间,并精确到天数,如:2018-09-21
select DATE_FORMAT(CONVERT_TZ(create_time, @@session.time_zone,'+8:00'),'%Y-%m-%d') from auth_user;

-- 将timestamp转换为指定时区的时间,并精确到天数后转换为timestamp,如:1537488000,精确到秒
select UNIX_TIMESTAMP(DATE_FORMAT(CONVERT_TZ(create_time, @@session.time_zone,'+8:00'),'%Y-%m-%d')) from auth_user;
-- 临时会话时区,转化为+08:00时区
SET time_zone='Asia/Shanghai';
select now();

SELECT count(*) AS amount, DATE_FORMAT(CONVERT_TZ(create_time, '+08:00','+10:00'),'%Y-%m-%d') 
AS createTime FROM auth_user WHERE DATE_FORMAT(CONVERT_TZ(create_time, '+08:00','+10:00'),'%Y-%m-%d')>= '2018-10-01'
AND DATE_FORMAT(CONVERT_TZ(create_time, '+08:00','+10:00'),'%Y-%m-%d')<= '2018-10-10' 
GROUP BY DATE_FORMAT(CONVERT_TZ(create_time, '+08:00','+10:00'),'%Y-%m-%d') 
ORDER BY DATE_FORMAT(CONVERT_TZ(create_time, '+08:00','+10:00'),'%Y-%m-%d') DESC

-- 查询结果
-- 1	2018-10-10
-- 2	2018-10-09
-- 1	2018-10-08
-- 1	2018-10-05
-- 11	2018-10-04
-- 15	2018-10-03
-- 2	2018-10-02
-- 5	2018-10-01

-- 转化为UTC时区,即 +00:00时区

SET time_zone='UTC';
select now();
SELECT count(*) AS amount, DATE_FORMAT(CONVERT_TZ(create_time, '+00:00','+10:00'),'%Y-%m-%d') 
AS createTime FROM auth_user WHERE DATE_FORMAT(CONVERT_TZ(create_time, '+00:00','+10:00'),'%Y-%m-%d')>=  '2018-10-01'
AND DATE_FORMAT(CONVERT_TZ(create_time,  '+00:00','+10:00'),'%Y-%m-%d')<= '2018-10-10' 
GROUP BY DATE_FORMAT(CONVERT_TZ(create_time,  '+00:00','+10:00'),'%Y-%m-%d')
 ORDER BY DATE_FORMAT(CONVERT_TZ(create_time,  '+00:00','+10:00'),'%Y-%m-%d') DESC 

-- 1	2018-10-10
-- 2	2018-10-09
-- 1	2018-10-08
-- 1	2018-10-05
-- 11	2018-10-04
-- 15	2018-10-03
-- 2	2018-10-02
-- 5	2018-10-01
> set global time_zone = '+8:00';  ##修改mysql全局时区为北京时间,即我们所在的东8区
> set time_zone = '+8:00';  ##修改当前会话时区
> flush privileges;  #立即生效

 

### MySQL 时间格式转换方法 在 MySQL 中,可以利用内置的时间处理函数实现不同类型之间的相互转换。其中最常用的就是 `DATE_FORMAT()` 函数,它用于将日期/时间值按指定的格式返回字符串。 #### 1. **基本语法** `DATE_FORMAT()` 的通用格式如下: ```sql DATE_FORMAT(date, format) ``` 这里 `date` 是要被格式化的日期或时间表达式,而 `format` 则是一个模式串,用来定义输出的具体样式[^1]。 #### 2. **常见格式化选项** 以下是几种常用的 `%` 符号及其对应的含义: | 格式字符 | 描述 | 示例 | |----------|--------------------------|------------------| | `%Y` | 年份,四位数 | 2023 | | `%y` | 年份,两位数 | 23 | | `%m` | 数字月份 | 08 | | `%c` | 数字月份(无前导零) | 8 | | `%M` | 文本月份名 | August | | `%W` | 星期几全称 | Monday | | `%a` | 缩写的星期名称 | Mon | | `%D` | 英文序数后缀的天 | 1st, 2nd | | `%e` | 天(无前导零) | 5 | | `%d` | 带前导零的天 | 05 | | `%H` | 小时 (24小时制) | 17 | | `%h` | 小时 (12小时制) | 05 | | `%i` | 分钟 | 30 | | `%s` | 秒 | 45 | #### 3. **实际应用案例** ##### (1)**获取当前时间并格式化** 假设想得到类似于 `"YYYY-MM-DD HH:mm:ss"` 这样的标准格式,则可执行下面这条命令: ```sql SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); ``` 这将会依据服务器所在时区给出即时时刻的结果[^2]。 ##### (2)**提取特定部分** 有时只需要知道某一天属于哪一年或者那一周的第一天是什么时候等等简单信息就够了。比如截取出给定日期里的年度编号可以用这种方式来: ```sql SELECT DATE_FORMAT('2000-05-07', '%Y'); -- 返回 "2000" ``` 同样也可以只保留月日而不关心具体的年份: ```sql SELECT DATE_FORMAT('2000-05-07', '%m%d'); -- 结果为 "0507" ``` ##### (3)**复杂组合示例** 更进一步讲,还可以把多个元素拼接起来形成更加丰富的描述性文字。例如显示完整的日期加上当天英文缩写形式的名字以及具体几点几分这样的完整表述: ```sql SELECT DATE_FORMAT('2000-05-07 05:06:07', '%Y-%m-%d %H:%i:%s %a'); -- 输出形如:"2000-05-07 05:06:07 Sun" ``` 另外需要注意的是,如果输入的数据本身不符合预期结构的话可能会导致错误或者是空白输出。所以务必确认所提供的参数确实满足相应的要求后再调用此类功能[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值