使用时间和服务日数据计算卡车的服务日期
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
【讨论】:
以上是关于使用时间和服务日数据计算卡车的服务日期的主要内容,如果未能解决你的问题,请参考以下文章