时间函数CONVERT和DATEADD的实际应用,求每个月最后一天

本文介绍了一种SQL技巧,用于从数据库中精确筛选出每个月最后一天的数据。通过使用DATEADD和CONVERT函数组合,可以轻松实现月末数据的提取,并提供了一个自定义函数方便复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

         在实际工作中,经常遇到求一些特殊时间的提取数据要求。

其中一个需求,要求某时间字段,所获取数据的时间都是每个月的最后一天。

一、以下举例说明:

Statdate

Value_id

Value_name

20180808

1000

Test1

20180824

2000

Test2

20180831

3000

Test3

20180730

4000

Test4

20180630

5000

Test5

20180228

6000

Test6

只取每个月末最后一天的数据,即表格中标为红色的数据:20180831/20180630/20180228这三天的数据。

1、建表语句:

create TABLE [dbo].[test_ceshi](

    [statdate]        [varchar](8) NULL,

    [Value_id]       [decimal](20, 4) NULL,

    [Value_name] [varchar](10) NULL

)

2、插入数据:

insert into  [test_ceshi] values ('20180808',1000,'Test1')

insert into  [test_ceshi] values ('20180824',2000,'Test2')

insert into  [test_ceshi] values ('20180831',3000,'Test3')

insert into  [test_ceshi] values ('20180730',4000,'Test4')

insert into  [test_ceshi] values ('20180630',5000,'Test5')

insert into  [test_ceshi] values ('20180228',6000,'Test6')

使用以下SQL语句即可查询所需要的数据:

select * from test_ceshi a where a.statdate  in

(select   convert(varchar(8),DATEADD(Day,-1,CONVERT(varchar(8),DATEADD(Month,1,statdate),120)+'01'),112) 

from test_ceshi)

此语句使用了函数dateadd和convert时间函数

DATEADD(Month,1,statdate)
----将时间增加一个月  20180808---->20180908
CONVERT(varchar(8),DATEADD(Month,1,statdate),120)
----将得到时间20180908转化格式120并截断8位,得到字符串结果:'2018-09-'
CONVERT(varchar(8),DATEADD(Month,1,statdate),120)+'01'
----将字符串结果:'2018-09-'加上01,得到字符串结果:'2018-09-01'
DATEADD(Day,-1,CONVERT(varchar(8),DATEADD(Month,1,statdate),120)+'01')
----将字符串’2018-09-01’转化成时间格式并减去一天,变成2018-08-31
convert(varchar(8),DATEADD(Day,-1,CONVERT(varchar(8),DATEADD(Month,1,statdate),120)+'01'),112)
----将时间格式的2018-08-31,转化为112格式的字符串20180831

补充一个自定义的函数,可以直接拿过用:

 

CREATE  FUNCTION  dbo.function_test_ceshi(@statdate_into   varchar(8))  

RETURNS varchar(8)    --返回返回值的数据类型

AS

BEGIN

declare @statdate_result varchar(8)

select @statdate_result =convert(varchar(8),DATEADD(Day,-1,CONVERT(varchar(8),DATEADD(Month,1,@statdate_into),120)+'01'),112) 
   
RETURN  @statdate_result

END

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值