1. 两个日期之间相差的月份和年份
1.1. DB2
1.2. MySQL
1.3. sql
select mnth, mnth/12from ( select (year(max_hd) - year(min_hd))*12 +(month(max_hd) - month(min_hd)) as mnthfrom (select min(hiredate) as min_hd, max(hiredate) as max_hdfrom emp) x) y
1.4. Oracle
1.4.1. sql
select months_between(max_hd,min_hd),months_between(max_hd,min_hd)/12from (select min(hiredate) min_hd, max(hiredate) max_hdfrom emp) x
1.5. PostgreSQL
1.5.1. sql
select mnth, mnth/12from (select ( extract(year from max_hd) -extract(year from min_hd) ) * 12+( extract(month from max_hd) -extract(month from min_hd) ) as mnthfrom (select min(hiredate) as min_hd, max(hiredate) as max_hdfrom emp) x) y
1.6. SQL Server
1.6.1. sql
select datediff(month,min_hd,max_hd),datediff(month,min_hd,max_hd)/12from (select min(hiredate) min_hd, max(hiredate) max_hdfrom emp) x
2. 两个日期之间相差的秒数、分钟数和小时数
2.1. 相差的天数分别乘以24(一天的小时数),1440(一天的分钟数)和86400(一天的秒数)
2.2. DB2
2.2.1. sql
select dy*24 hr, dy*24*60 min, dy*24*60*60 secfrom (select ( days(max(case when ename = 'WARD'then hiredateend)) -days(max(case when ename = 'ALLEN'then hiredateend))) as dyfrom emp) x
2.3. Oracle
2.4. PostgreSQL
2.5. sql
select dy*24 as hr, dy*24*60 as min, dy*24*60*60 as secfrom (select (max(case when ename = 'WARD'then hiredateend) -max(case when ename = 'ALLEN'then hiredateend)) as dyfrom emp) x
2.6. MySQL
2.7. SQL Server
2.8. sql
select datediff(day,allen_hd,ward_hd)*24 hr,datediff(day,allen_hd,ward_hd)*24*60 min,datediff(day,allen_hd,ward_hd)*24*60*60 secfrom (select max(case when ename = 'WARD'then hiredateend) as ward_hd,max(case when ename = 'ALLEN'then hiredateend) as allen_hdfrom emp) x
3. 当前记录和下一条记录之间的日期差
3.1. DB2
3.1.1. sql
select x.*,days(x.next_hd) - days(x.hiredate) difffrom (select e.deptno, e.ename, e.hiredate,(select min(d.hiredate) from emp dwhere d.hiredate > e.hiredate) next_hdfrom emp ewhere e.deptno = 10) x
3.2. Oracle
3.2.1. sql
select ename, hiredate, next_hd,next_hd - hiredate difffrom (select deptno, ename, hiredate,lead(hiredate)over(order by hiredate) next_hdfrom emp)where deptno=10
3.3. PostgreSQL
3.3.1. sql
select x.*,x.next_hd - x.hiredate as difffrom (select e.deptno, e.ename, e.hiredate,(select min(d.hiredate) from emp dwhere d.hiredate > e.hiredate) as next_hdfrom emp ewhere e.deptno = 10) x
3.4. MySQL
3.5. SQL Server
3.6. sql
select x.*,datediff(day,x.hiredate,x.next_hd) difffrom (select e.deptno, e.ename, e.hiredate,(select min(d.hiredate) from emp dwhere d.hiredate > e.hiredate) next_hdfrom emp ewhere e.deptno = 10) x
3.6.2. datediff(x.next_hd, x.hiredate) diff
3.6.2.1. 对于MySQL 版本的DATEDIFF函数,需要省略第一个参数day,并把剩下的两个参数的顺序颠倒过来
4. 一年中有多少个星期一
4.1. 方案
4.1.1. 生成一年里所有可能的日期值
4.1.2. 格式化上述日期值,并找出它们分别是星期几
4.1.3. 统计每个“星期x”出现的次数
4.2. DB2
4.2.1. sql
with x (start_date,end_date)as (select start_date,start_date + 1 year end_datefrom (select (current_date -dayofyear(current_date) day)+1 day as start_datefrom t1)tmpunion allselect start_date + 1 day, end_datefrom xwhere start_date + 1 day < end_date)select dayname(start_date),count(*)from xgroup by dayname(start_date)
4.3. Oracle
4.3.1. sql
with x as (select level lvlfrom dualconnect by level <= (add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y')))select to_char(trunc(sysdate,'y')+lvl-1,'DAY'), count(*)from xgroup by to_char(trunc(sysdate,'y')+lvl-1,'DAY')
4.3.2. sql
select to_char(trunc(sysdate,'y')+rownum-1,'DAY'),count(*)from t500where rownum <= (add_months(trunc(sysdate,'y'),12)- trunc(sysdate,'y'))group by to_char(trunc(sysdate,'y')+rownum-1,'DAY')
4.3.2.1. Oracle早期版本
4.4. PostgreSQL
4.4.1. sql
select to_char(cast(date_trunc('year',current_date)as date) + gs.id-1,'DAY'),count(*)from generate_series(1,366) gs(id)where gs.id <= (cast( date_trunc('year',current_date) +interval '12 month' as date) -cast(date_trunc('year',current_date)as date))group by to_char(cast(date_trunc('year',current_date)as date) + gs.id-1,'DAY')
4.5. MySQL
4.5.1. sql
select date_format(date_add(cast(concat(year(current_date),'-01-01')as date),interval t500.id-1 day),'%W') day,count(*)from t500where t500.id <= datediff(cast(concat(year(current_date)+1,'-01-01')as date),cast(concat(year(current_date),'-01-01')as date))group by date_format(date_add(cast(concat(year(current_date),'-01-01')as date),interval t500.id-1 day),'%W')
4.6. SQL Server
4.6.1. sql
with x (start_date,end_date)as (select start_date,dateadd(year,1,start_date) end_datefrom (select cast(cast(year(getdate()) as varchar) + '-01-01'as datetime) start_datefrom t1) tmpunion allselect dateadd(day,1,start_date), end_datefrom xwhere dateadd(day,1,start_date) < end_date)select datename(dw,start_date),count(*)from xgroup by datename(dw,start_date)OPTION (MAXRECURSION 366)