前言:
在实际工作中,经常遇到求一些特殊时间的提取数据要求。
其中一个需求,要求某时间字段,所获取数据的时间都是每个月的最后一天。
一、以下举例说明:
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
测试结果: