2011-06-14 94 views
-1

我有一个表只包含2列(时间和AMPM)。 这两列都是NVARCHAR。请帮我建立快速/优化的t-sql转换12小时时钟到24小时制

时间...... 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

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

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

非常感谢您的支持和歉意。

VCHA

回答

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 
+0

非常感谢。这也有助于我得到一些想法。 – tong 2011-06-15 03:32:35

0

我创建了一个表中调用12HourClock包含您在您的示例中指定的列。

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

对不起,但它不是很清楚你在这里找什么。什么是包含时间的数据类型?你试图产生什么数据类型(或字符串格式)?没有这些,这个问题是非常开放的(错误)解释。

随着中说,一些准则,可以帮助:

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

但是......正确配置12:00 AM或PM将会非常棘手。一方面,12:00 AM(又名午夜)在24小时内表示为00:00,这可能是也可能不是你想要的。但是,如果你采取中午12点和(按照上述)为“下午”增加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)) 
+0

我以为我在我的问题中已经提到,两列都是NVARCHAR。所以他们应该是字符串,对不对?顺便说一句,非常感谢你的指导方针。 – tong 2011-06-15 03:30:11

相关问题