【发布时间】: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,由于评论字符串的大小,这是第二条评论。
标签: tsql datetime sql-server-2005