SQLSERVER 2008:将整天的输出分为2个记录,持续12个小时

时间:2016-04-08 14:01:23

标签: sql-server sql-server-2008

我正在寻找下面的记录数。

PLANNED_SHIP_From_Date PLANNED_SHIP_To日期Total_Lines_Count ....

1)09-04-2016 07:00:01 09-04-2016 18:59:59 165 .....

2)09-04-2016 19:00:00 10-04-2016 07:00:00 121 .....

3)10-04-2016 07:00:01 10-04-2016 18:59:59 165 .....

4)10-04-2016 19:00:00 11-04-2016 07:00:00 123 .....

5)11-04-2016 07:00:01 11-04-2016 18:59:59 234 .....

目前我的查询是根据日期计算记录。

SELECT
   cast(shdr.PLANNED_SHIP_DATE as date),
   SUM(sdtl_1_1.TOTAL_LINES_COUNT) AS TOTAL_LINES_COUNT 
FROM
   dbo.SHIPMENT_HEADER AS shdr WITH (NOLOCK) 
INNER JOIN
   (
      SELECT
         SHIPMENT_ID,
         COUNT(*) AS TOTAL_LINES_COUNT 
      FROM
         dbo.SHIPMENT_DETAIL AS SHIPMENT_DETAIL_1 WITH (NOLOCK) 
      WHERE
         (
            STATUS1 >= 401
         ) 
         AND (
            DATEDIFF(day, PLANNED_SHIP_DATE, CONVERT(date, SYSDATETIME())) < 4
         ) 
      GROUP BY
         SHIPMENT_ID
   ) AS sdtl_1_1 
      ON sdtl_1_1.SHIPMENT_ID = shdr.SHIPMENT_ID 
WHERE
   (
      shdr.TRAILING_STS >= 401
   ) 
   AND (
      DATEDIFF(day, shdr.PLANNED_SHIP_DATE, CONVERT(date, SYSDATETIME())) < 4
   ) 
GROUP BY
   cast(shdr.PLANNED_SHIP_DATE as date)

3 个答案:

答案 0 :(得分:1)

试试这个 -

DECLARE @ReportDays int = 30,
        @StartHr    int = 7,
        @Today      DATETIME2 = CAST(SYSDATETIME() AS DATE);

--http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/you-require-a-numbers-table.aspx
WITH 
    a AS (SELECT 1 AS i UNION ALL SELECT 1),
    b AS (SELECT 1 AS i FROM a AS x, a AS y),
    c AS (SELECT 1 AS i FROM b AS x, b AS y),
    d AS (SELECT 1 AS i FROM c AS x, c AS y),
    e AS (SELECT 1 AS i FROM d AS x, d AS y),
    numbers as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS number FROM e),
    StartDates AS (
        SELECT
                DATEADD(
                    HH, 
                    @StartHr + (n2.number * 12),
                    DATEADD(D, 0-n1.number, @Today)
                ) AS StartDT
        FROM 
            (SELECT * FROM numbers WHERE Number BETWEEN 0 AND @ReportDays) n1
                CROSS JOIN (SELECT * FROM numbers WHERE Number IN (0,1)) n2
        ),
    DateRanges AS 
    (SELECT StartDT, DATEADD(hh, 12, StartDT) AS EndDT FROM StartDates),
    Shipments AS 
    (SELECT
        StartDT AS PLANNED_SHIP_From_Date,
        EndDT AS PLANNED_SHIP_To_Date,
        1 AS Shipment
    FROM
        DateRanges dr
            LEFT JOIN dbo.SHIPMENT_DETAIL  sd
                ON sd.Status1 >=401
                AND sd.PLANNED_SHIP_DATE BETWEEN dr.StartDT AND dr.EndDT)
SELECT
    PLANNED_SHIP_From_Date,
    PLANNED_SHIP_To_Date,
    SUM(Shipment) AS TOTAL_LINES_COUNT
FROM
    Shipments
ORDER BY 
    PLANNED_SHIP_From_Date;

我们正在做的是 -

  • 建立数字表
  • 使用它来提取日期列表,每天有两条记录
  • 制定出发点&amp;每个时间窗口的完成时间
  • 将时间窗口加入记录并汇总

希望有所帮助: - )

答案 1 :(得分:0)

在select ....中添加另一列

CASE 
  WHENE DATEPART(HOUR, Planned_SHIP_DATE) < 12 THEN 'AM' ELSE 'PM'
END AS ShipPeriod

然后你可以将该列添加到GROUPING中以从'PM'中分离'AM'

当然我已经假装你想要上午/下午。但是您可以修改CASE语句以根据需要打破小时数。

希望这有帮助

答案 2 :(得分:0)

谢谢大家的帮助。

我创建了一个适合我的SQL查询。此查询将早上7点至晚上7点的记录计数作为MORNING_SHIFT计数,将晚上7点至次日早上7点的记录计数作为过去日期超过14天的EVENING_SHIFT。

SELECT    

CASE
WHEN convert(VARCHAR(50), sh.PLANNED_SHIP_DATE, 120)  BETWEEN 
   (convert(VARCHAR(10), sh.PLANNED_SHIP_DATE, 120) + ' 07:00:00') AND 
   (convert(VARCHAR(10), sh.PLANNED_SHIP_DATE, 120) + ' 18:59:59')
THEN (CONCAT(cast(sh.PLANNED_SHIP_DATE as date),' ','morning_shift'))

WHEN convert(VARCHAR(50), sh.PLANNED_SHIP_DATE, 120)  BETWEEN 
   (convert(VARCHAR(10), sh.PLANNED_SHIP_DATE, 120) + ' 00:00:00') AND 
   (convert(VARCHAR(10), sh.PLANNED_SHIP_DATE, 120) + ' 06:59:59')
then (CONCAT(cast(DATEADD(DAY, -1, sh.PLANNED_SHIP_DATE) as date),' ','EVENING_shift'))
when
   convert(VARCHAR(50), DATEADD(DAY, -1, sh.PLANNED_SHIP_DATE) , 120)       BETWEEN (convert(VARCHAR(10), cast(DATEADD(DAY, -1, sh.PLANNED_SHIP_DATE) as date), 120) + ' 19:00:00') AND 
   (convert(VARCHAR(10), cast(DATEADD(DAY, -1, sh.PLANNED_SHIP_DATE) as date), 120) + ' 23:59:59')
THEN (CONCAT(cast(DATEADD(DAY, -1, sh.PLANNED_SHIP_DATE) as date),' ','EVENING_shift'))

END AS 'actual_date_time', sh.PLANNED_SHIP_DATE


FROM dbo.SHIPMENT_HEADER AS sh WITH (nolock)
WHERE (shdr.TRAILING_STS >= 401) AND (DATEDIFF(day, shdr.ACTUAL_SHIP_DATE_TIME, CONVERT(date, SYSDATETIME())) < 14)
group by sh.ACTUAL_SHIP_DATE_TIME;