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

前言:

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

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

一、以下举例说明:

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

测试结果:

猜你喜欢

转载自blog.csdn.net/lanxingbudui/article/details/81702708