使用时间和服务日数据计算卡车的服务日期

时间:2018-03-26 14:35:16

标签: tsql datetime sql-server-2005

我们有一些卡车在不同的日子里服务于某些目的地。在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将解决它。

如何计算?

谢谢你们。

1 个答案:

答案 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