sql - 在SQL中当前选择后如何查看值是否在表中再次出现
问题描述
我有以下数据表 [CRA_feasibility_test]
atmid CRA monday tuesday wednesday thursday friday saturday
DA0068C1 ABC Y N Y N N Y
我想根据我的日期的工作日选择数据。如果它是 Y,那么想要获得最接近的“Y”,即从@date 开始的 Y 天。
我也想得到下一个
我正在做以下事情
declare @date datetime set @date ='2018-06-15'
Select @dateT as indentdate, DATENAME(dw,@dateT) as weekdayname,
case when DATENAME(dw,@dateT) ='monday'
then monday
when DATENAME(dw,@dateT) ='tuesday' then
tuesday
when DATENAME(dw,@dateT) ='wednesday' then
wednesday
when DATENAME(dw,@dateT) ='Thursday' then
thursday
when DATENAME(dw,@dateT) ='Friday' then
friday
when DATENAME(dw,@dateT) ='Saturday' then
saturday
end feasible
from [CRA_feasibility_test]
解决方案
如果我理解正确,您可以尝试为接下来的 7 天 by 创建日历表cte recursive
,然后使用CROSS APPLY
with values
make unpivot 获取Y
最近的日期。
declare @dateT datetime
set @dateT ='2018-06-15'
;with calendar as (
select @dateT startDt,dateadd(day,7,@dateT) endDt, 1 rn
union all
select dateadd(day,1,startDt) , endDt,rn +1
from calendar
WHERE dateadd(day,1,startDt)<endDt
), cte as (
select
atmid,v.*
from CRA_feasibility_test cross apply (
values ('monday',monday), ('tuesday',tuesday), ('wednesday',wednesday), ('thursday',thursday), ('friday',friday), ('saturday',saturday)
) v(name,flag)
)
select atmid,
@dateT today,
min(case when flag = 'Y' then startDt end) nextYDay,
datename(dw,min(case when flag = 'Y' then startDt end) ) nextYname
from calendar t1
join cte t2 on datename(dw,startDt) = t2.name
group by atmid
结果
atmid today nextYDay nextYname
DA0068C1 15/06/2018 00:00:00 16/06/2018 00:00:00 Saturday
推荐阅读
- python - 正则表达式:匹配部分字符串直到字符,除非遇到另一个
- python - 无凭据错误 - 使用 boto3 和 aws s3 存储桶
- c++ - 编译 C++ 时未定义的引用
- html - 如何使用来自不同页面的链接展开下拉列表
- typescript - 在我的 firebase 项目(!= 和!==)中,打字稿检查不相等性失败
- scala - 为 fs2.Stream 的所有元素同时安排计算
- javascript - 复制一个函数的类型减去第一个参数
- android - android studio 在特定的小时和分钟设置闹钟并发出声音
- android - 如何在sharedpreferences android中保存应用程序选择的语言
- ios - 具有大型数据集的 Firestore 地图字段性能