SqlServer-按日期取最大/最小的一条记录

创建表与表数据

CREATE TABLE tbMaxDate
(
    Guid uniqueidentifier Primary Key  default upper((replace(newid(),'-',''))) not null,
    Name varchar(255) not null,
    createTime datetime not null
)

insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小绿','2019-04-10 09:38:53.793')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小绿','2019-04-10 10:40:57.243')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小绿','2019-04-11 09:56:53.433')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小绿','2019-04-12 08:02:53.483')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小红','2019-04-10 09:45:53.563')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小红','2019-04-10 07:16:57.113')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小红','2019-04-11 11:49:15.233')
insert into tbMaxDate(Guid,Name,createTime)values(NEWID(),'小红','2019-04-12 15:12:19.453')

select * from tbMaxDate order by name

1.取全表最大日期的记录

select * from tbMaxDate A  where createTime=(select max(createTime) from tbMaxDate B where A.[Name]=B.[Name])

select * from tbMaxDate A where  not exists (select 1 from tbMaxDate where name=A.name and createTime>A.createTime) 

2.取某个时间段最大日期记录

在规定的时间里取最大日期记录应该在max中多加上规定时间条件,如下两图对比

select * from tbMaxDate A  
where CONVERT(varchar, createTime, 23) ='2019-04-10'  
and createTime=(select max(createTime) from tbMaxDate B where A.[Name]=B.[Name])

select * from tbMaxDate A 
where CONVERT(varchar, createTime, 23) ='2019-04-10'    
and not exists (select 1 from tbMaxDate where name=A.name and createTime>A.createTime) 

select * from tbMaxDate A  
where CONVERT(varchar, createTime, 23) ='2019-04-10'  
and createTime=(select max(createTime) from tbMaxDate B where A.[Name]=B.[Name] and CONVERT(varchar, createTime, 23) ='2019-04-10')

select * from tbMaxDate A 
where CONVERT(varchar, createTime, 23) ='2019-04-10'    
and not exists (select 1 from tbMaxDate where name=A.name and createTime>A.createTime and CONVERT(varchar, createTime, 23) ='2019-04-10') 

还有另外一种写法,通过子查询形式


select * from tbMaxDate A  
where CONVERT(varchar, createTime, 23) ='2019-04-10'  
and createTime=(
    select max(createTime) from
    (
        select * from tbMaxDate 
        where CONVERT(varchar, createTime, 23) ='2019-04-10'
    ) B where A.[Name]=B.[Name]
)

select * from tbMaxDate A 
where CONVERT(varchar, createTime, 23) ='2019-04-10'    
and not exists (
    select 1 from 
    (
        select * from tbMaxDate  
        where CONVERT(varchar, createTime, 23) ='2019-04-10'
    ) temp where temp.name=A.name and temp.createTime>A.createTime
)

补充:两个日期之间的最大日期记录

3.取全表最小日期的记录

select * from tbMaxDate A  where createTime=(select MIN(createTime) from tbMaxDate B where A.[Name]=B.[Name])

select * from tbMaxDate A where  not exists (select 1 from tbMaxDate where name=A.name and createTime<A.createTime)

4.取某个时间段最小日期记录

在规定的时间里取最小日期记录可以在min中加上规定时间条件,也可以不加,如下两图对比

select * from tbMaxDate A  
where CONVERT(varchar, createTime, 23) ='2019-04-10'   
and createTime=(select MIN(createTime) from tbMaxDate B where A.[Name]=B.[Name])

select * from tbMaxDate A 
where CONVERT(varchar, createTime, 23) ='2019-04-10'  
and not exists (select 1 from tbMaxDate where name=A.name and createTime<A.createTime) 

select * from tbMaxDate A  
where CONVERT(varchar, createTime, 23) ='2019-04-10'   
and createTime=(select MIN(createTime) from tbMaxDate B where A.[Name]=B.[Name] and CONVERT(varchar, createTime, 23) ='2019-04-10')

select * from tbMaxDate A 
where CONVERT(varchar, createTime, 23) ='2019-04-10'  
and not exists (select 1 from tbMaxDate where name=A.name and createTime<A.createTime and CONVERT(varchar, createTime, 23) ='2019-04-10') 

还有另外一种写法,通过子查询形式

select * from tbMaxDate A  
where CONVERT(varchar, createTime, 23) ='2019-04-10'  
and createTime=(
    select MIN(createTime) from
    (
        select * from tbMaxDate 
        where CONVERT(varchar, createTime, 23) ='2019-04-10'
    ) B where A.[Name]=B.[Name]
)

select * from tbMaxDate A 
where CONVERT(varchar, createTime, 23) ='2019-04-10'    
and not exists (
    select 1 from 
    (
        select * from tbMaxDate  
        where CONVERT(varchar, createTime, 23) ='2019-04-10'
    ) temp where temp.name=A.name and temp.createTime<A.createTime
)

补充:两个日期之间的最小日期记录

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值