我们有一些卡车在不同的日子里服务于某些目的地。在Sql Server表中,表格如下所示。
TruckCode ServiceHour Monday Tuesday Wednesday Thursday Friday Saturday
Route1 17:00 1 0 1 0 1 0
Route2 09:30 1 1 1 1 1 1
Route3 14:30 0 1 0 1 0 0
此表的说明, Route1卡车服务于周一,周三,周五,服务时间为17:00。 Route2卡车每天服务,服务时间为09:30。 Route3卡车服务于周二,周四,服务时间为14:30。
我有订单日期,这些订单有卡车代码和订单时间。我想计算订单送达的日期和时间。星期天,没有服务。
例如,订单时间为17:05的订单,订单日为星期一,卡车代码为Route1,将于星期三17:00送达。因为,星期二不是Route1的服务日,时间是星期一5分钟。
我正在研究基于charindex的解决方案,如下所示。
我将日数据加入一个字符串,例如Route1,10101001010100
,这表示,第一个字符为1,然后此路由在星期一提供,第二个字符为0,则此路由不在星期二等服务。
我得到的日期是((datepart(dw,@orderInsertDate) + @@DATEFIRST-2) % 7+1)
charindex功能是:
CHARINDEX('1','10101001010100',((datepart(dw,@orderInsertDate) + @@DATEFIRST-2) % 7+1)+
(case when ServeTime < getdate() then 1 else 0 end)
)
我也需要比较时间,因为例如在星期一16:30插入的Route1订单在同一天投放,但在星期一17:30插入的订单在下周三投放。仍然无法设法计算正确的值,但我认为charindex将解决它。
如何计算?
谢谢你们。
答案 0 :(得分:1)
这需要标准化数据,但我认为它有效。相信我,值得对数据进行规范化。
它不会换到下周但你可以检查null并换行到第一次交付。
declare @R table (id int identity primary key, name varchar(20), tm time not null);
insert into @R (name, tm) values ('Route1', '17:00');
declare @D table (fk int, d tinyint not null);
insert into @D (fk, d) values (1, 2), (1, 4), (1, 6);
declare @dd int = 2;
declare @tt time = cast('17:05' as time);
select top (1)
r.name, r.tm, d.d, @dd as dOr, @tt as tOr
from @R r
join @D d
on d.fk = r.id
where r.id = 1
and d.d > @dd
or (d.d = @dd and r.tm >= @tt)
order by d.d;
name tm d dOr tOr
-------------------- ---------------- ---- ----------- ----------------
Route1 17:00:00.0000000 4 2 17:05:00.0000000