SQL 依据特定时间单位检索数据,你想依据指定的月份、星期或者其他时间单位来筛选记录行。例如,你希望找出入职月份是 February(2 月)或者 December(12 月),并且入职当天是 Tuesday(星期二)的所有员工。
SQL 依据特定时间单位检索数据 问题描述
你想依据指定的月份、星期或者其他时间单位来筛选记录行。例如,你希望找出入职月份是 February(2 月)或者 December(12 月),并且入职当天是 Tuesday(星期二)的所有员工。
SQL 依据特定时间单位检索数据 解决方案
使用关系数据库管理系统中的函数来找出一个日期值对应的月份和星期。在很多情况下,本实例可能都会有用。试想,如果我们希望依据 HIREDATE
做一些检索,但又想忽略年份,只按照月份检索(或者按照 HIREDATE
里其他我们感兴趣的时间单位来检索),这个时候本实例提供的技巧就有了用武之地。下面给出的解决方案以月份和星期的检索为例。掌握了各种数据库提供的日期格式化函数之后,我们就能很方便地修改这些解决方案以实现按照年份检索,按照季度检索,按照年份和季度的组合检索,按照月份和年份的组合检索,等等。
DB2 和 MySQL
使用函数 MONTHNAME
和 DAYNAME
分别找出员工入职日期所对应的月份和星期。
1 select ename
2 from emp
3 where monthname(hiredate) in ('February','December')
4 or dayname(hiredate) = 'Tuesday'
Oracle 和 PostgreSQL
使用 TO_CHAR
函数找出员工入职日期对应的月份和星期,使用 RTRIM
函数过滤掉尾部的空格字符。
1 select ename
2 from emp
3 where rtrim(to_char(hiredate,'month')) in ('february','december')
4 or rtrim(to_char(hiredate,'day')) = 'tuesday'
SQL Server
使用 DATENAME
函数找出员工入职日期对应的月份和星期。
1 select ename
2 from emp
3 where datename(m,hiredate) in ('February','December')
4 or datename(dw,hiredate) = 'Tuesday'
SQL 依据特定时间单位检索数据 扩展知识
对于以上所有解决方案而言,关键在于知道要调用哪个函数以及如何调用。如果想确认每个函数返回的结果值,不妨在 SELECT
子句后面直接调用相应的函数并检查其输出结果。下面列出了 DEPTNO
等于 10 的员工对应的查询结果集。
select ename,datename(m,hiredate) mth,datename(dw,hiredate) dw
from emp
where deptno = 10
ENAME MTH DW
------ --------- ---------
CLARK June Tuesday
KING November Tuesday
MILLER January Saturday
一旦知道了相关的函数返回的结果值,那么利用上述解决方案里用到的函数来筛选行记录就非常容易了。