也是做数据分析嘛, SQL 必然是每天都要用的, 然后在分析中, 时间是数据分析中极为重要的部分, 可以说是承上启下或者是贯穿整个分析. 比如, 日, 周, 月, 季度, 年度 与之相对应的 环比, 同比 等基础指标都是与时间相关的, 其重要性可见一斑. 虽然各个主流的商业数据库写法有差异, 但基本都差不多的, 这里就用 Mysql 作为演示了, 虽然主要用 IQ Sybase 这个列数据库更多一些.

然而往往这些时间字段, 都质量不高, 需要额外去处理, 比如, 字符串时间, 精确到秒的时间, 时间需要提取, 时间需要计算, 周, 月等各种操作. 每次是现查, 于是这里打算来小小整理一波, 也是做个笔记方便自己查. 就好比今天有个面谈, 问我 SVM 的目标函数, 推导啥的, 我的确是一点点推导过的, 但现场就是忘了, 一点也想不起来, 我觉得也没关系, 看下自己笔记, 然后一行行公式解释出来, 也是可以的嘛, 都是自己的笔记, 为啥就不能查阅下呢,面谈来整, 确实有点压力哦...

当前时刻 now()

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2020-07-16 23:30:15 |
+---------------------+
1 row in set (0.00 sec) mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 23:30:09 |
+-----------+
1 row in set (0.00 sec)

当前日期 年-月-日 curdate( )

mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2020-07-16 |
+------------+
1 row in set (0.00 sec)

将字符串时间转为 年-月-日 date( )

mysql> select date('2020-07-16');
+--------------------+
| date('2020-07-16') |
+--------------------+
| 2020-07-16 |
+--------------------+
mysql> select date('2020-07-16 22:22:22');
+-----------------------------+
| date('2020-07-16 22:22:22') |
+-----------------------------+
| 2020-07-16 |
+-----------------------------+
1 row in set (0.00 sec)

时间转字符串 date_format()

mysql> select date_format(now(), '%Y-%m-%d');
+--------------------------------+
| date_format(now(), '%Y-%m-%d') |
+--------------------------------+
| 20-07-16 |
+--------------------------------+
1 row in set (0.00 sec)

字符串转时间 str_to_date()

+------------------------------------------+
| str_to_date('2016-01-02', '%Y-%m-%d %H') |
+------------------------------------------+
| 2016-01-02 00:00:00 |
+------------------------------------------+
1 row in set (0.00 sec)

时间 / 时间戳互转

mysql> select unix_timestamp(now());
+-----------------------+
| unix_timestamp(now()) |
+-----------------------+
| 1594914762 |
+-----------------------+
1 row in set (0.00 sec) mysql> select from_unixtime(1594914762);
+---------------------------+
| from_unixtime(1594914762) |
+---------------------------+
| 2020-07-16 23:52:42 |
+---------------------------+
1 row in set (0.02 sec)

字符串 / 时间戳互转

mysql> select unix_timestamp('2020-07-16');
+------------------------------+
| unix_timestamp('2020-07-16') |
+------------------------------+
| 1594828800 |
+------------------------------+
1 row in set (0.00 sec) mysql> select from_unixtime(1594828800, '%Y-%d');
+------------------------------------+
| from_unixtime(1594828800, '%Y-%d') |
+------------------------------------+
| 2020-16 |
+------------------------------------+
1 row in set (0.00 sec) mysql> select from_unixtime(1594828800, '%Y-%m-%d');
+---------------------------------------+
| from_unixtime(1594828800, '%Y-%m-%d') |
+---------------------------------------+
| 2020-07-16 |
+---------------------------------------+
1 row in set (0.00 sec)

给时间加一个增量 date_add( ) 和 adddate( )

  • ADDDATE(date, INTERVAL expr, unit)
mysql> select date_add('2020-07-16', interval 10 day);
+-----------------------------------------+
| date_add('2020-07-16', interval 10 day) |
+-----------------------------------------+
| 2020-07-26 |
+-----------------------------------------+
mysql> select date_add('2020-07-16', interval 1 week);
+-----------------------------------------+
| date_add('2020-07-16', interval 1 week) |
+-----------------------------------------+
| 2020-07-23 |
+-----------------------------------------+
1 row in set (0.00 sec) mysql> select date_add('2020-07-16', interval 1 month);
+------------------------------------------+
| date_add('2020-07-16', interval 1 month) |
+------------------------------------------+
| 2020-08-16 |
+------------------------------------------+
1 row in set (0.00 sec)

如果不指定时间间隔, 则默认单位为 day

+-------------------------+
| adddate('2020-7-16', 4) |
+-------------------------+
| 2020-07-20 |
+-------------------------+
1 row in set (0.00 sec) mysql> select adddate(curdate(), 4);
+-----------------------+
| adddate(curdate(), 4) |
+-----------------------+
| 2020-07-20 |
+-----------------------+
1 row in set (0.00 sec)

加法和减法, 其实都是加法.

mysql> select adddate(curdate(), -4);
+------------------------+
| adddate(curdate(), -4) |
+------------------------+
| 2020-07-12 |
+------------------------+
1 row in set (0.02 sec) mysql> select adddate(curdate(), -33);
+-------------------------+
| adddate(curdate(), -33) |
+-------------------------+
| 2020-06-13 |
+-------------------------+
1 row in set (0.00 sec)

一定要写减, 用 date_sub(date, INTERVAL expr unit) 也行, 强迫症的话.

mysql> select date_sub('2020-7-16', interval 4 day);
+---------------------------------------+
| date_sub('2020-7-16', interval 4 day) |
+---------------------------------------+
| 2020-07-12 |
+---------------------------------------+
1 row in set (0.00 sec) mysql> select date_sub('2020-7-16', interval 33 day);
+-----------------------------------------+
| date_sub('2020-7-16', interval 33 day) |
+-----------------------------------------+
| 2020-06-13 |
+-----------------------------------------+
1 row in set (0.00 sec)

计算日期是当年的第几周 week( )

  • week(date, mode)
mysql> select week('2020-01-05');
+--------------------+
| week('2020-01-05') |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.00 sec) mysql> select week(date('2020-01-05'));
+--------------------------+
| week(date('2020-01-05')) |
+--------------------------+
| 1 |
+--------------------------+
1 row in set (0.00 sec)

mysql 是正常的, 一周是从 周1 到周天. 而像 IQ Sybase 就是西式的. 然后要自己写一个 case when.

-- IQ
set datefirst 1;
select
case
when datepart(weekday, 日期字段) = 7
then datepart(week, dateadd(day, -1, 日期字段))
else
datepart(week, 日期字段)
end as date_week

日期是周几 dayname(date) 和 dayofweek(date)

mysql> select dayname('2020-07-16');
+-----------------------+
| dayname('2020-07-16') |
+-----------------------+
| Thursday |
+-----------------------+
1 row in set (0.00 sec) mysql> select dayofweek('2020-07-16');
+-------------------------+
| dayofweek('2020-07-16') |
+-------------------------+
| 5 |
+-------------------------+
1 row in set (0.00 sec)

这个返回天还是有点问题, 中国人看应该返回 4 才对, 它又是从 周天开始算的, 我有点懵逼...

**日期是一月 or 年的第多少天 dayofmonth(); dayofyear(); **

mysql> select dayofmonth('2020/7/16');
+-------------------------+
| dayofmonth('2020/7/16') |
+-------------------------+
| 16 |
+-------------------------+
1 row in set (0.00 sec) mysql> select dayofyear('2020-7-16');
+------------------------+
| dayofyear('2020-7-16') |
+------------------------+
| 198 |
+------------------------+
1 row in set (0.00 sec)

计算两个日期的差 datediff ( )

  • datediff (data_01, date_02) 返回 date_01 - date_02 相差的天数
mysql> select datediff('2020-7-16', '2020-07-01');
+-------------------------------------+
| datediff('2020-7-16', '2020-07-01') |
+-------------------------------------+
| 15 |
+-------------------------------------+
1 row in set (0.00 sec) mysql> select datediff('2020-7-16', '2020-07-20');
+-------------------------------------+
| datediff('2020-7-16', '2020-07-20') |
+-------------------------------------+
| -4 |
+-------------------------------------+
1 row in set (0.00 sec) mysql> select datediff('2020-7-16', '2020-01-1');
+------------------------------------+
| datediff('2020-7-16', '2020-01-1') |
+------------------------------------+
| 197 |
+------------------------------------+
1 row in set (0.00 sec)

计算日期当月的最后一天 last_day(date)

mysql> select last_day('2020-07-16');
+------------------------+
| last_day('2020-07-16') |
+------------------------+
| 2020-07-31 |
+------------------------+
1 row in set (0.00 sec) mysql> select last_day(now());
+-----------------+
| last_day(now()) |
+-----------------+
| 2020-07-31 |
+-----------------+
1 row in set (0.00 sec) mysql> select last_day('2020-2-1');
+----------------------+
| last_day('2020-2-1') |
+----------------------+
| 2020-02-29 |
+----------------------+
1 row in set (0.00 sec)

Mysql 常用时间函数(上)的更多相关文章

  1. MySQL常用时间函数

    官方文档:Date and Time Functions Name Description ADDDATE() Add time values (intervals) to a date value ...

  2. mysql常用时间函数与类型转换

    一.用到的函数有: 1.时间格式化函数  DATE_FORMAT(date,format) 2.时间加减函数DATE_ADD(date,INTERVAL expr unit)DATE_SUB(date ...

  3. Mysql常用时间函数的用法和应用

    /* ---1)整型时间戳转换为date的格式(yyyymmdd, yyyy年mm月dd)--*/ , '%Y%m%d' ); -- 20090806 , '%Y年%m月%d' ); -- 2009年 ...

  4. MySql 常用时间函数

    1.date() 提取日期或日期时间表达式的日期部分 select date(create_time) from blog_article; 2.date_format() select date_f ...

  5. mysql时间类型总结及常用时间函数

    日期时间和类型 常用日期和时间类型 字节 year                1       表示年份                   值范围:(1901----2155) date     ...

  6. PLSQL常用时间函数

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  7. MySQL日期时间函数大全(转)

    MySQL日期时间函数大全 DAYOFWEEK(date)  返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK('1 ...

  8. 【转】MySQL日期时间函数大全

    MySQL日期时间函数大全 1.DAYOFWEEK(date)  返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK( ...

  9. [转]MySQL常用Json函数和MySQL常用字符串函数

    MySQL常用Json函数:https://www.cnblogs.com/waterystone/p/5626098.html MySQL常用字符串函数:https://www.cnblogs.co ...

  10. Lua常用时间函数

    常用时间函数 print(os.time()) --当前系统时间值 print(os.date( print(os.date("*t"), os.time()) --当前系统时间表 ...

随机推荐

  1. 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

    title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过 ...

  2. Java获得当前日期是星期几

    第一种方法:   /**   * 获取当前日期是星期几<br>   *   * @param date   * @return 当前日期是星期几   */   public String ...

  3. Netty - [01] 概述

    题记部分 一.介绍 Netty 是由JBOSS提供的一个Java开源框架,现为Github上的独立项目. Netty是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I/O程 ...

  4. Flink学习(十九) 容错机制

    主要内容: 一致性检查点(checkpoint) 从检查点恢复到状态 Flink检查点算法 保存点(savepoint) 一致性检查点(checkpoint) Flink故障恢复机制的核心,就是应用状 ...

  5. 【论文随笔】推荐系统综述_推荐模型、推荐技术与应用领域(A Survey of Recommendation Systems_ Recommendation Models, Techniques, and Application Fields)

    前言 今天读的论文为一篇于2022年1月3日发表的论文,这篇文章是关于推荐系统的综述,主要研究了推荐系统在不同服务领域的应用趋势,包括推荐模型.技术和应用领域.通过分析2010年至2021年间发表的顶 ...

  6. 读论文-序列感知推荐系统(Sequence-Aware Recommender Systems)

    前言 今天读的论文为一篇于2018年发表在(ACM computing surveys (CSUR))的论文,这篇文章主要讲述了序列感知推荐系统(Sequence-Aware Recommender ...

  7. 咨询公司:趁着AI人工智能的浪潮还能持续,好好享受吧……

    在人工生成式智能热潮的喧嚣与狂热之中,咨询行业正经历一场基本未被察觉却极具变革性的革命,这场变革将塑造它的未来. 传统咨询依赖于由高素质专业人士组成的团队,他们专注于研究.数据分析,并提供定制化建议. ...

  8. JS代码执行

  9. [AI/GPT/综述] AI Agent的设计模式综述

    序:文由 其一,随着大模型的发展,通用智能不断迭代升级,应用模式也不断创新,从简单的Prompt应用.RAG(搜索增强生成).再到AI Agent(人工智能代理). 其中AI Agent一直是个火热的 ...

  10. mac、windows 配置python国内镜像源

    前言 我们在使用python pip安装第三方库时,经常会发生超时报错,这是可以指定临近的镜像源快速更新. mac中 在用户目录下建立一个".pip"目录,到目录里新建一个文件&q ...