0

我正在使用一个完全混乱的数据库,需要找出修复它的最佳方法。现在我有进入这个表格的时间是 12 小时和 24 小时格式(有些是 01:30 PM,有些是 13:30 PM)。为了正确地将预定时间与实际时间进行比较,我需要采用标准化的 24 小时格式。

下面的示例表: 注意我不能做任何永久性更改,因为我没有这些数据的权限。

Sched St Date         Sched Time  Actual Start            Actual End
09/11/2017 00:00:00   11:30 AM    09/11/2017 11:34:16     09/11/2017 11:58:00
05/26/2017 00:00:00   03:30 PM    05/26/2017 15:40:00     05/26/2017 15:55:15
11/06/2017 00:00:00   19:30 PM    11/06/2017 21:25:00     11/06/2017 21:45:00

现在我有:

    Select DB.TBL.*, 
    case when left (Sched_Time, 2) > 12
    and Sched_Time like '%PM%' 
    then concat((left(Sched_Time, 2) - 12),right(Sched_Time, 6))
Else concat(Left(Sched_Time,2)right(Sched_Time, 6)) 
End;

当我尝试连接以获得全职时间(即 07:00 PM)时出现错误。任何人都可以用一种干净的方式帮助我吗?

4

1 回答 1

0

我建议您将 Sched_Time 从 VARCHAR 转换为 TIME。然后您可以将 Sched_Time 规范化为 24 小时格式,并将其与 Sched_St_Date 结合以获得您想要的 TIMESTAMP 字段。

  1. 清理、提取数字时间部分并将其转换为 TIME 字段:
CAST(  
  SUBSTRING(Sched_Time FROM 0 FOR POSITION(' ' IN Sched_Time)) AS TIME  
) AS NumericTime

这假定所有字段都有一个“”分隔符。根据您的数据有多糟糕,您可能会收到 CAST 错误。只需继续添加逻辑来处理不同的条件。

  1. 确定值是 AM 还是 PM:
CASE
  WHEN POSITION('AM' IN Sched_Time) > 0 THEN 'AM'  
  WHEN POSITION('PM' IN Sched_Time) > 0 THEN 'PM'  
  ELSE 'PM' -- Assume 'PM' if not specified (can change as needed)  
END AS TimeOfDay
  1. 使用上面的部分将 NumericTime 标准化为 24 小时格式:
CASE  
  WHEN CAST(SUBSTRING(TRIM(Sched_Time) FROM 0 FOR 2) AS INTEGER) > 12 THEN NumericTime -- Already in 24-hour format  
  ELSE CASE  
    WHEN TimeOfDay = 'AM' THEN NumericTime -- Already suitable for 24-hour format  
    ELSE NumericTime + INTERVAL '12' HOUR -- Convert 'PM' time to 24-hour format     
  END
END AS MyFinalTime
  1. 按照 dnoeth 的建议将 MyFinalTime 字段与 Sched_Dt 字段结合起来:

https://stackoverflow.com/a/47526411/8772888

CAST(Sched_St_Date AS DATE) + CAST(MyFinalTime AS INTERVAL HOUR TO
MINUTE) AS Sched_St_Timestamp
  1. 把它们放在一起:
SELECT CAST(
    SUBSTRING(Sched_Time FROM 0 FOR POSITION(' ' IN Sched_Time)) AS TIME
  ) AS NumericTime,
  CASE  
    WHEN POSITION('AM' IN Sched_Time) > 0 THEN 'AM'  
    WHEN POSITION('PM' IN Sched_Time) > 0 THEN 'PM'  
    ELSE 'PM' -- Assume 'PM' if not specified (can change as needed)  
  END AS TimeOfDay,
  CASE  
    WHEN CAST(SUBSTRING(TRIM(Sched_Time) FROM 0 FOR 2) AS INTEGER) > 12 THEN NumericTime -- Already in 24-hour format  
    ELSE CASE  
      WHEN TimeOfDay = 'AM' THEN NumericTime -- Already suitable for 24-hour format  
      ELSE NumericTime + INTERVAL '12' HOUR -- Convert 'PM' time to 24-hour format  
    END  
  END AS MyFinalTime,
  CAST(Sched_St_Date AS DATE) + CAST(MyFinalTime AS INTERVAL HOUR TO MINUTE) AS Sched_St_Timestamp
FROM DB.TBL

我无法访问 TD 系统进行检查,因此可能存在一些语法错误。您可能需要修改逻辑以适合您的实际数据。让我知道结果如何。

于 2017-11-29T20:12:41.323 回答