Sql server 检查下一期是否从上一期结束时开始
我有几种用法。一个是准备,另一个是实际使用 需要检查预付费类型上一期间的开始和结束日期是否等于下一期间的开始和结束日期以供使用 在期末,我已经准备好了使用费,根据逻辑,下一期的使用费必须与上一期的预付费相匹配。但有时我会遇到这两种类型不匹配的情况。 比如说Sql server 检查下一期是否从上一期结束时开始,sql-server,date,tsql,Sql Server,Date,Tsql,我有几种用法。一个是准备,另一个是实际使用 需要检查预付费类型上一期间的开始和结束日期是否等于下一期间的开始和结束日期以供使用 在期末,我已经准备好了使用费,根据逻辑,下一期的使用费必须与上一期的预付费相匹配。但有时我会遇到这两种类型不匹配的情况。 比如说 1 (128193 ,'2020-05-01', '2020-05-31','prepaid'), 2 (134145 ,'2020-06-01', '2020-06-30','prepaid'), 3 (1
1 (128193 ,'2020-05-01', '2020-05-31','prepaid'),
2 (134145 ,'2020-06-01', '2020-06-30','prepaid'),
3 (134145 ,'2020-05-01', '2020-05-30','usage'),
示例记录编号3应与记录编号1匹配,因为它在该期间预付了费用,在这种情况下,它们在134145期间的使用开始和结束日期与前一期间的预付费用的开始和结束日期128193不匹配
我需要找到那些箱子
我已经创建了一个脚本
声明@t TABLE id INT,startdate DATE,enddate DATE,u_type VARCHAR255
插入@t
价值128193、‘2020-05-01’、‘2020-05-31’、‘预付’,
134145、‘2020-06-01’、‘2020-06-30’、‘预付’,
134145、‘2020-05-01’、‘2020-05-30’、‘用法’,
141461,“2020-07-01”,“2020-07-31”,“预付款”,
141461、‘2020-06-01’、‘2020-06-30’、‘使用’;
使用cte
选择“按id排序”上的行号作为r,
身份证件
开始日期,
结束日期,
u型
来自@t
选择c2.id,
c1.id,
c1.起始日期,
c1.截止日期,
c2.开始日期,
c2.enddate,
c1.u_型,
c2.u_型
来自cte c1
在c2.r+1=c1.r和c2.u型c1.u型上连接cte c2
其中DATEADDd,1,c2.enddate c1.startdate
但它返回的结果不正确
这是一次运行,所以我不关心性能速度,可以使用任何需要的表格作为CTE,有没有关于如何修复它的想法
预付费记录总是在未来一段时间内使用。不是吗:
select
p.id as p_id, u.id as u_id,
p.startdate as p_startdate, u.startdate as u_startdate,
p.enddate as p_enddate, u.enddate as u_enddate
from
@t u
inner join @t p
on(
p.u_type = 'prepaid'
--
and p.startdate <= u.enddate
and p.enddate >= u.startdate
)
where
u.u_type = 'usage'
--
and (
p.startdate <> u.startdate
or p.enddate <> u.enddate
)
我们寻找符合使用情况的预付费,然后检查其边界。不是吗:
select
p.id as p_id, u.id as u_id,
p.startdate as p_startdate, u.startdate as u_startdate,
p.enddate as p_enddate, u.enddate as u_enddate
from
@t u
inner join @t p
on(
p.u_type = 'prepaid'
--
and p.startdate <= u.enddate
and p.enddate >= u.startdate
)
where
u.u_type = 'usage'
--
and (
p.startdate <> u.startdate
or p.enddate <> u.enddate
)
我们查找与使用情况匹配的预付费,然后检查其边界。您可以使用和,如下所示:
声明@t TABLE id INT,startdate DATE,enddate DATE,u_type VARCHAR255
插入@t
价值128193、‘2020-05-01’、‘2020-05-31’、‘预付’,
134145、‘2020-06-01’、‘2020-06-30’、‘预付’,
134145、‘2020-05-01’、‘2020-05-30’、‘用法’,
141461,“2020-07-01”,“2020-07-31”,“预付款”,
141461、‘2020-06-01’、‘2020-06-30’、‘使用’;
带CTE_周期_范围
作为选择ID,
开始日期,
结束日期,
U_型,
LEADSTARTDATE,1个按U型超额分配的订单,按STARTDATE作为下一个(U期)STARTDATE,
LEADENDDATE,1按U型订单超额付款,按STARTDATE作为下一个_期间_ENDDATE
来自@t
选择ID,
开始日期,
结束日期,
U型
从CTE_周期_范围
其中开始日期下一个\u时段\u开始日期或
结束日期下一个\u期间\u结束日期和
下一个\u时段\u开始日期不为空;-这将过滤掉每种类型的最后一次出现,因为此记录没有后续期间
这将返回:
╔════════╦════════════╦════════════╦═════════╗
║ id ║ startdate ║ enddate ║ u_type ║
╠════════╬════════════╬════════════╬═════════╣
║ 128193 ║ 2020-05-01 ║ 2020-05-31 ║ prepaid ║
║ 134145 ║ 2020-06-01 ║ 2020-06-30 ║ prepaid ║
║ 134145 ║ 2020-05-01 ║ 2020-05-30 ║ usage ║
╚════════╩════════════╩════════════╩═════════╝
请参见SQLFIDLE:您可以使用和,如下所示:
声明@t TABLE id INT,startdate DATE,enddate DATE,u_type VARCHAR255
插入@t
价值128193、‘2020-05-01’、‘2020-05-31’、‘预付’,
134145、‘2020-06-01’、‘2020-06-30’、‘预付’,
134145、‘2020-05-01’、‘2020-05-30’、‘用法’,
141461,“2020-07-01”,“2020-07-31”,“预付款”,
141461、‘2020-06-01’、‘2020-06-30’、‘使用’;
带CTE_周期_范围
作为选择ID,
开始日期,
结束日期,
U_型,
LEADSTARTDATE,1个按U型超额分配的订单,按STARTDATE作为下一个(U期)STARTDATE,
LEADENDDATE,1按U型订单超额付款,按STARTDATE作为下一个_期间_ENDDATE
来自@t
选择ID,
开始日期,
结束日期,
U型
从CTE_周期_范围
其中开始日期下一个\u时段\u开始日期或
结束日期下一个\u期间\u结束日期和
下一个\u时段\u开始日期不为空;-这将过滤掉每种类型的最后一次出现,因为此记录没有后续期间
这将返回:
╔════════╦════════════╦════════════╦═════════╗
║ id ║ startdate ║ enddate ║ u_type ║
╠════════╬════════════╬════════════╬═════════╣
║ 128193 ║ 2020-05-01 ║ 2020-05-31 ║ prepaid ║
║ 134145 ║ 2020-06-01 ║ 2020-06-30 ║ prepaid ║
║ 134145 ║ 2020-05-01 ║ 2020-05-30 ║ usage ║
╚════════╩════════════╩════════════╩═════════╝
请参阅SQLFiddle:在您的解决方案中,它只在当前期间内进行检查,但我需要检查前一预付款中的开始和结束日期是否=下一预付款中的开始和结束日期。如果不返回是的,本月预付费是下个月预付费在您的解决方案中,它只在当前期间内检查,但我需要检查上一个预付费中的开始和结束日期是否=下一个预付费中的开始和结束日期。如果不返回是的,本月预付的是下个月预付的。我修改了我的答案。Pl
z、 检查它是否解决了你的问题。我修改了我的答案。请检查它是否解决了您的问题。