sql日期求匹配,要求不用循环

nikolaichow 2018-04-05 02:41:26
A表规定归集日期,A表的数据是活动的
B表是个日期表,根据B表的日期找到A表的归集日期
如下图中:5.1日-5.4日之间归集至5.1日,5.5日-5.10日之间归集至5.10,5.10日以后归集至5.10日

需求:sql语句不要使用循环,能否通过一条select查询解决?


...全文
872 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-04-05
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
GO
CREATE TABLE A([归集日期] datetime)
CREATE TABLE B([当前日期] DATETIME,[归集日期] datetime)
GO
SET NOCOUNT ON
INSERT INTO A VALUES ('2018-05-01')
INSERT INTO A VALUES ('2018-05-05')
INSERT INTO A VALUES ('2018-05-10')
GO
INSERT INTO B([当前日期]) 
SELECT DATEADD(DAY,sv.number,'2018-04-28') 
FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number BETWEEN 0 AND 14
GO
----------- 以上为创建测试表及测试数据 ------------
;with cte as (
	SELECT ROW_NUMBER() OVER (ORDER BY t1.[归集日期]) as rid,* FROM A AS t1
)
,cte2 AS (
	SELECT t1.归集日期 as beginTime,isnull(t2.归集日期,t1.归集日期+5)-1 as endTime 
	FROM cte AS t1 LEFT JOIN cte AS t2 ON t1.rid=t2.rid-1	
)
SELECT 
	t1.当前日期
	,t2.beginTime as 归集日期 
FROM B AS t1 
	LEFT JOIN cte2 AS t2 ON t1.[当前日期] 
	BETWEEN t2.beginTime and t2.endTime
/*
当前日期				归集日期
2018-04-28 00:00:00.000	NULL
2018-04-29 00:00:00.000	NULL
2018-04-30 00:00:00.000	NULL
2018-05-01 00:00:00.000	2018-05-01 00:00:00.000
2018-05-02 00:00:00.000	2018-05-01 00:00:00.000
2018-05-03 00:00:00.000	2018-05-01 00:00:00.000
2018-05-04 00:00:00.000	2018-05-01 00:00:00.000
2018-05-05 00:00:00.000	2018-05-05 00:00:00.000
2018-05-06 00:00:00.000	2018-05-05 00:00:00.000
2018-05-07 00:00:00.000	2018-05-05 00:00:00.000
2018-05-08 00:00:00.000	2018-05-05 00:00:00.000
2018-05-09 00:00:00.000	2018-05-05 00:00:00.000
2018-05-10 00:00:00.000	2018-05-10 00:00:00.000
2018-05-11 00:00:00.000	2018-05-10 00:00:00.000
2018-05-12 00:00:00.000	2018-05-10 00:00:00.000
*/
卖水果的net 2018-04-05
  • 打赏
  • 举报
回复

select B.B日期, (select max(A.日期) from A where A.日期 <= B.日期) A日期
from B


  • 打赏
  • 举报
回复
;with 
a as
	(select * from
		(values(cast('2018-5-1' as date)),('2018-5-5'),('2018-5-10')
		)as t(gjrq)
	)
,b as
	(select* from
		(values(cast('2018-4-28' as date)),('2018-4-29'),('2018-4-30'),('2018-5-1'),('2018-5-2'),('2018-5-3'),('2018-5-4'),('2018-5-5'),('2018-5-6'),('2018-5-7'),('2018-5-8'),('2018-5-9'),('2018-5-10'),('2018-5-11'),('2018-5-12')
		) as t(dqrq)
	)
select dqrq 当前日期,max(a.gjrq)归集日期 from b left join a on b.dqrq >=a.gjrq group by b.dqrq 
/*
当前日期	归集日期
2018-04-28	NULL
2018-04-29	NULL
2018-04-30	NULL
2018-05-01	2018-05-01
2018-05-02	2018-05-01
2018-05-03	2018-05-01
2018-05-04	2018-05-01
2018-05-05	2018-05-05
2018-05-06	2018-05-05
2018-05-07	2018-05-05
2018-05-08	2018-05-05
2018-05-09	2018-05-05
2018-05-10	2018-05-10
2018-05-11	2018-05-10
2018-05-12	2018-05-10
*/

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧