日期时间函数
- DATE_FORMAT(datetime ,fmt)和STR_TO_DATE(str, fmt)所需的日期模板
- 使用NOW(),SYSDATE(),CURDATE(),CURTIME()获取当前时间
SELECT CURTIME(),CURDATE(),NOW(),SYSDATE(); |
- DATEDIFF(date1,date2) 返回两个日期之间相差的天数
SELECT DATEDIFF(CURDATE(),’2019-3-1′); — 计算当前日期和2019-3-1之间相差的天数 |
案例: 计算员工表中服务年限大于35年的员工信息,并且按照年薪升序排列
SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限”FROM EMPWHERE ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) > 35ORDER BY 服务年限; |
SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限”FROM EMPWHERE ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) > 35ORDER BY 服务年限; |
SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限”FROM EMPWHERE ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) > 35ORDER BY 服务年限; |
SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限”FROM EMPWHERE ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) > 35ORDER BY 服务年限; |
注意:在WHERE子句中无法使用字段别名。这是因为MySql执行语句的顺序决定的
上面语句执行的顺序是:(1)FROM (2)WHERE (3)SELECT (4)ORDER BY 。中间的每一步都会生成一张虚拟表,后面的步骤都是在上一张虚拟表中进行筛选与查询的。在执行WHERE子句的时候还没有字段的别名。但是在执行ORDER BY的时候,字段的别名已经存在了。
我们可以使用如下的方式进行解决(后面我们会详细讲解这种用法)
SELECT TEMP.*FROM ( SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限” FROM EMP) TEMPWHERE TEMP.服务年限 > 35; |
SELECT TEMP.*FROM ( SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限” FROM EMP) TEMPWHERE TEMP.服务年限 > 35; |
SELECT TEMP.*FROM ( SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限” FROM EMP) TEMPWHERE TEMP.服务年限 > 35; |
SELECT TEMP.*FROM ( SELECT EMPNO,ENAME,JOB,HIREDATE, ROUND(DATEDIFF(SYSDATE(),HIREDATE)/365) “服务年限” FROM EMP) TEMPWHERE TEMP.服务年限 > 35; |
- DATE_ADD(datetime, INTERVALE expr type), 返回与给定日期时间相差INTERVAL时间段的日期时间
案例: 查询EMP表中员工的转正日期
aft-type="table" data-size="normal" data-row-style="normal">
SELECT EMPNO,ENAME,JOB,HIREDATE 入职日期, DATE_ADD(HIREDATE, INTERVAL 3 MONTH) 转正日期FROM EMP; |
SELECT EMPNO,ENAME,JOB,HIREDATE 入职日期, DATE_ADD(HIREDATE, INTERVAL 3 MONTH) 转正日期FROM EMP; |
- STR_TO_DATE(str, fmt) 把一个字符串按照日期模板解析为DATE类型。注意:表示日期的字符串的字符串的格式必须要和模板的格式一致,转换才能成功
SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1980-12-17′,’%Y-%m-%d’); SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1981/20/2′,’%Y/%d/%m’); |
-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1980-12-17′,’%Y-%m-%d’); SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1981/20/2′,’%Y/%d/%m’); |
SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1980-12-17′,’%Y-%m-%d’); SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1981/20/2′,’%Y/%d/%m’); |
SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1980-12-17′,’%Y-%m-%d’); SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1981/20/2′,’%Y/%d/%m’); |
-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1980-12-17′,’%Y-%m-%d’); SELECT * FROM EMPWHERE HIREDATE = STR_TO_DATE(‘1981/20/2′,’%Y/%d/%m’); |
- DATE_FORMAT(datetime ,fmt) 把一个日期类型的数据格式化为特定格式的字符串
案例: 查询员工的信息,把员工的入职日期显示为”日-月-年”格式
draft-type="table" data-size="normal" data-row-style="normal">
SELECT EMPNO,ENAME,HIREDATE ‘标准日期’, DATE_FORMAT(HIREDATE,’%d-%m-%Y’) “日期1″FROM EMP ; |
SELECT EMPNO,ENAME,HIREDATE ‘标准日期’, DATE_FORMAT(HIREDATE,’%d-%m-%Y’) “日期1″FROM EMP ; |