请帮我构建快速/优化的t-sql,将12小时制转换为24小时制

时间:2011-06-14 17:58:57

标签: sql-server-2005 tsql sql-server-2008

我的表只包含2列(时间和AMPM)。 两列都是NVARCHAR。

时间...... AMPM

07:30 AM .....

8时45 ..... PM

12:00 PM .....

01:00 PM .....

12:00 AM .....

我需要构建t-sql以将上述数据转换为

时间

07:30

20:45

12:00

13:00

0时

你可能知道,我想以自定义字符串格式将12小时制转换为24小时制。 现在,我必须将时间列转换为datetime变量并再次转换为12小时时钟系统,因为我不想拆分字符串然后执行加法/减法。

请建议/指导我优化的t-sql来做到这一点。由于某些限制,我无法在代码上执行此任务。我被迫只在SQL SERVER 2005/2008上这样做。

感谢adv,对不起英语。

VCHA

3 个答案:

答案 0 :(得分:1)

很抱歉,但目前还不是很清楚你在寻找什么。包含时间的数据类型是什么?您要生成的数据类型(或字符串格式)是什么?没有这些,问题就是(错误的)解释是非常开放的。

据说,有些指导方针可能有所帮助:

  • 将您的数据(如有必要)转换为适当的日期/时间数据类型
  • SQL 2008具有Time数据类型。如果可以的话,使用它来保持简单
  • 如果/当您将12小时添加到开始时间时,请使用DATEADD功能。使用此功能可为PM数据的(转换)时间增加12小时。

但是...正确配置12:00 AM或PM将是棘手的。一方面,上午12:00(又称午夜)在24小时时间表示为00:00,这可能是您想要的,也可能不是。但如果你在中午12点和(如上所述)为“PM”增加12小时,你就会到达午夜,这不是你想要的。可能你需要用CASE语句做一些棘手的事情。这是一个基于我之前所知的无法完成查询的示例:

  ,dateadd(hh
           ,case
              when SomeTime = '12:00' and AM_PM = 'PM' then 0
              when SomeTime = '12:00' and AM_PM = 'AM' then 12
              when AM_PM = 'AM' then 0
              else 12  --  PM
            end
           ,cast(SomeTime as time))

答案 1 :(得分:1)

如果要支持MS SQL 2005,则无法使用时间数据类型。 我的解决方案使用了一些转换:

-- test data:
SELECT '07:30' AS Time, 'AM' AS AMPM
INTO testTime
UNION ALL 
SELECT '08:45' AS Time, 'PM'
UNION ALL 
SELECT '12:00' AS Time, 'PM'
UNION ALL 
SELECT '01:00' AS Time, 'PM'
UNION ALL 
SELECT '12:00' AS Time, 'AM'
UNION ALL 
SELECT '07:15' AS Time, 'AM'

-- Final query
SELECT TIME, AMPM , 
       CASE WHEN AMPM = 'PM' THEN 
         CAST( CAST(LEFT(Time, 2) AS int) + 12 AS varchar)+substring(Time, 3, 3) 
       ELSE 
         Time 
       END
FROM testTime

答案 2 :(得分:0)

我创建了一个名为12HourClock的表,其中包含您在示例中指定的列。

SELECT LEFT(CAST(CONVERT(time, [Time] + ' ' + AMPM, 8) AS nvarchar(5)), 5) AS 'Time'
FROM [12HourClock]