我的表只包含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
答案 0 :(得分:1)
很抱歉,但目前还不是很清楚你在寻找什么。包含时间的数据类型是什么?您要生成的数据类型(或字符串格式)是什么?没有这些,问题就是(错误的)解释是非常开放的。
据说,有些指导方针可能有所帮助:
Time
数据类型。如果可以的话,使用它来保持简单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]