营业日期和路线顺序

-2 sql-server t-sql

+-------------------------------------------------------------------+
|Route |Sequence|        Planned Time       |     Business Date     |
+-------------------------------------------------------------------+
| 10-1 |   1    |  2015-08-21 20:15:00.000  |      2015-08-21       |
| 10-1 |   2    |  2015-08-22 00:30:00.000  |      2015-08-21       |
| 10-1 |   3    |  2015-08-22 08:45:00.000  |      2015-08-21       |
| 22-1 |   1    |  2015-08-20 17:30:00.000  |      2015-08-20       |
| 22-1 |   2    |  2015-08-21 01:10:00.000  |      2015-08-20       |
| 22-1 |   3    |  2015-08-21 06:30:00.000  |      2015-08-20       |
+------+--------+---------------------------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

上图是最终目标……但我需要帮助。

装运和交付在一周中的每天进行,但是,仅记录为​​周一至周五的营业日期。周六和周日的每次交付都将记录为周五的营业日期。中午到中午的逻辑是针对路线出发时间的复杂性及其彼此唯一的顺序依赖性。路线 1A 于周一晚上 8 点出发,沿途有 15 个连续停靠点,其中一个停靠点是路线 1B 的起点,这种情况仍在继续。好消息是这些路线的每个人,第一个顺序开始时间是在中午之前。

因此,在我们的业务结构中,我们的路线通宵运行。我试图通过采用该路线的“计划时间”的最早序列并将其作为营业日期(如果它在前一天开始)来创建营业日期的标准。

我当前的脚本如下所示:

Case When datepart(dw, Planned Time ) = 1 --and DATEPART(hour,Planned Time )<=12
  then convert(date,dateadd(day,0,(dateadd(dd, - 2, Planned Time )  )))
When datepart(dw, Planned Time ) = 2 and DATEPART(hour,Planned Time )<=12
then CONVERT(Date,DATEADD(DAY,0,Planned Time ))  
When datepart(dw, Planned Time ) = 3 and DATEPART(hour,Planned Time )<=12
then CONVERT(Date,DATEADD(DAY,0,Planned Time )) 
When datepart(dw, Planned Time ) = 4 and DATEPART(hour,Planned Time )<=12
then CONVERT(Date,DATEADD(DAY,0,Planned Time )) 
        When datepart(dw, s.stp_schdtearliest) = 5 
        and DATEPART(hour,s.stp_schdtearliest)<=12
then CONVERT(Date,DATEADD(DAY,0,Planned Time )) 
        When datepart(dw, s.stp_schdtearliest) = 6 
        and DATEPART(hour,Planned Time )<=12
then CONVERT(Date,DATEADD(DAY,0,Planned Time )) 
When datepart(dw, s.stp_schdtearliest) = 7 --and DATEPART(hour,Planned Time )<=12
THEN convert(date,dateadd(day,0,(dateadd(dd, - 1, Planned Time )  )))
ELSE CONVERT(Date,Planned Time ) END BusinessDate
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下有效,但是进入第二天的路线的顺序也将采用第二天的营业日期。- 所以它并没有完全奏效。

Aar*_*and 5

鉴于样本数据,这是我的第一次尝试:

SELECT 
  [Route], 
  [Sequence] = ROW_NUMBER() OVER 
    (PARTITION BY [Route] ORDER BY [Planned Time]),  
  [Planned Time], 
  [Business Date] = MIN(CONVERT(DATE, [Planned Time])) OVER 
    (PARTITION BY [Route])
FROM dbo.table_name
ORDER BY [Route], [Sequence];
Run Code Online (Sandbox Code Playgroud)

不过,我确定您还没有提到某些边缘情况,而且我怀疑您的路线编号可能会重复。如果后者为真,您需要指出如何识别一行是属于“那天”还是前一天。如果它的字面意思是“中午之前的任何事情,包括中午,都属于前一天”,请尝试:

SELECT 
  [Route], 
  [Sequence] = ROW_NUMBER() OVER 
    (PARTITION BY [Route], CONVERT(DATE, pt) ORDER BY [Planned Time]),  
  [Planned Time], 
  [Business Date] = CONVERT(DATE, pt)
FROM 
( 
  SELECT [Route], [Planned Time], 
    pt = DATEADD(HOUR, -12, [Planned Time])
  FROM dbo.table_name
  -- WHERE ?
) AS x
ORDER BY [Route], [Sequence];
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这些都是不好的列名 - 您应该避免使用关键字、保留字和特殊字符(如空格)。

  • @TnL ***请***将该信息放入问题中。还要解释为什么 - 如果“第一个顺序开始时间在中午之前” - 您是否将序号 1 分配给了第一行,该行的开始时间为晚上 8 点 15 分?这似乎与您的评论相冲突。路线的起点是在中午之前、中午之后还是以上都没有?如何将该行标识为路线的起点? (2认同)