SELECT employee_name, hire_date FROM dmhr.employee WHERE employee_name IN ('马学铭', '陈仙');
输出结果:
通过 MAX() 将原数据转为一行,示例语句如下所示:
SELECTMIN (hire_date) AS min_hd, MAX (hire_date) AS max_hd FROM dmhr.employee WHERE employee_name IN ('马学铭', '陈仙');
输出结果:
枚举 2 个日期之间的天数,示例语句如下所示:
SELECT (max_hd - min_hd) + 1AS 天数 FROM (SELECTMIN (hire_date) AS min_hd, MAX (hire_date) AS max_hd FROM dmhr.employee WHERE employee_name IN ('马学铭', '陈仙')) x;
输出结果:
与 T500 做笛卡尔积枚举 30 天的所有日期,示例语句如下所示:
SELECT min_hd + (dmhr.t500.id - 1) AS 日期 FROM (SELECTMIN (hire_date) AS min_hd, MAX (hire_date) AS max_hd FROM dmhr.employee WHERE employee_name IN ('马学铭', '陈仙')) x, dmhr.t500 WHERE dmhr.t500.id <= ( (max_hd - min_hd) + 1);
输出结果:
根据日期得到对应的工作日信息,示例语句如下所示:
SELECT 日期, TO_CHAR (日期, 'DY', 'NLS_DATE_LANGUAGE = American') AS dy FROM (SELECT min_hd + (dmhr.t500.id - 1) AS 日期 FROM (SELECTMIN (hire_date) AS min_hd, MAX (hire_date) AS max_hd FROM dmhr.employee WHERE employee_name IN ('马学铭', '陈仙')) x, dmhr.t500 WHERE dmhr.t500.id <= ( (max_hd - min_hd) + 1));
输出结果:
过滤并汇总,示例语句如下所示:
SELECTCOUNT (*) FROM (SELECT 日期, TO_CHAR (日期, 'DY', 'NLS_DATE_LANGUAGE = American') AS dy FROM (SELECT min_hd + (dmhr.t500.id - 1) AS 日期 FROM (SELECTMIN (hire_date) AS min_hd, MAX (hire_date) AS max_hd FROM dmhr.employee WHERE employee_name IN ('马学铭', '陈仙')) x, dmhr.t500 WHERE dmhr.t500.id <= ((max_hd - min_hd) + 1))) WHERE dy NOTIN ('SAT', 'SUN');
输出结果:
求一年中周内各日期的天数
比如,计算一年内有多少天是星期一,多少天是星期二等,可以按照如下步骤实现:
取得大当前年度信息。
计算一年有多少天。
生成日期列表。
转换为对应的星期标识。
汇总统计。
示例语句如下所示:
WITH x0 AS (SELECTTO_DATE ('2020-01-01', 'yyyy-mm-dd') AS 年初 FROM DUAL), x1 AS (SELECT 年初, ADD_MONTHS (年初, 12) AS 下年初 FROM x0), x2 AS (SELECT 年初, 下年初, 下年初 - 年初 AS 天数 FROM x1), x3 AS (SELECT 年初 + (LEVEL - 1) AS 日期 FROM x2 CONNECTBYLEVEL <= 天数), x4 AS (SELECT 日期, TO_CHAR (日期, 'DY') AS 星期 FROM x3) SELECT 星期, COUNT (*) AS 天数 FROM x4 GROUPBY 星期;
输出结果:
确定当前记录和下一条记录之间相差的天数
使用 lead() over() 分析函数,将下一条记录的雇佣日期作为当前行,示例语句如下所示:
SELECT employee_id,employee_name,hire_date, LEAD (hire_date) OVER (ORDERBY hire_date) next_hd FROM dmhr.employee WHERE job_id = 11;
输出结果:
统计数据,示例语句如下所示:
SELECT employee_name,hire_date,next_hd,next_hd - hire_date diff FROM (SELECT employee_id,employee_name,hire_date, LEAD (hire_date) OVER (ORDERBY hire_date) next_hd FROM dmhr.employee WHERE job_id = 11);