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

Posted

技术标签:

【中文标题】使用时间和服务日数据计算卡车的服务日期【英文标题】:Calculate service date of a truck with time and service day data 【发布时间】:2018-09-04 17:58:55 【问题描述】:

我们有一些卡车在不同的日子为一些目的地提供服务。在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 会解决它。

如何计算?

从现在开始谢谢。

【问题讨论】:

我们可以看看您解决问题的尝试吗?有什么研究吗?提示:使用适当的软件(mysql、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。 我尝试了一个带有表变量的解决方案,获取订单日期的工作日数,以及 sql 中的 while 循环计算服务日期并将其插入表变量,然后从该表中选择最小日期哪个日期大于订单日期。我现在尝试的第二种方法是charindex。我将天数加入到一个字符中,例如 (10101010001) 并获得订单日期的工作日,因为今天是 1,因为它是星期一。并使用 charindex 搜索第一个 1 值开始订单日期工作日,如 CHARINDEX('1','1010101001',@weekDay)。我现在正在研究 charindex。 我们有 Sql Server 2005,由于评论字符串的大小,这是第二条评论。 【参考方案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

【讨论】:

以上是关于使用时间和服务日数据计算卡车的服务日期的主要内容,如果未能解决你的问题,请参考以下文章

计算通过的服务时间

在游戏中计算卡车载货量

卡车设置中的HERE路由问题

BPM实例分享——日期自动计算

使用Python编程计算一个月有多少分钟

访问 XP 报表总和计算