问题描述
|
我有一个表只包含2列(时间和AMPM)。
两列都是NVARCHAR。
时间...... AMPM
07:30 ..... AM
08:45 ..... PM
12:00 PM
01:00 .... PM
12:00 AM
我需要构建T-sql将上述数据转换为
时间
07:30
20:45
12:00
13:00
00:00
如您所知,我想以自定义字符串格式将12小时制转换为24小时制。
现在,我必须将时间列转换为日期时间变量,并再次转换为12小时制,因为我不想拆分字符串然后执行加/减。
请建议/指导我进行优化的T-sql来执行此操作。由于某些限制,我无法在代码上执行此任务。我被迫仅在sql SERVER 2005/2008上执行此操作。
感谢在广告中,对不起英语。
茶
解决方法
如果要支持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,\'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
, 抱歉,但是您在这里找的不是很清楚。包含时间的数据类型是什么?您要产生的数据类型是什么(或字符串格式)?没有这些,这个问题就很容易被(错误)解释。
话虽如此,一些准则可能会有所帮助:
将您的数据(如有必要)转换为适当的日期/时间数据类型
SQL 2008的数据类型为“ 1”。如果可以的话,使用它可以使事情变得简单
如果/当您将开始时间增加12小时时,请使用DATEADD
功能。使用此功能可以将您的(转换)时间增加12个小时,以获取PM数据。
但是...正确配置12:00 AM或PM将非常棘手。一方面,在24小时内将12:00 AM(又名午夜)表示为00:00,这可能是您想要的,也可能不是。但是,如果您花了12:00 PM,并且(如上所述)为“ PM”添加了12小时,那么您将到达Midnight,这不是您想要的。奇怪的是,您必须使用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))
, 我创建了一个名为12HourClock的表,其中包含您在示例中指定的列。
SELECT LEFT(CAST(CONVERT(time,[Time] + \' \' + AMPM,8) AS nvarchar(5)),5) AS \'Time\'
FROM [12HourClock]