由于您的数据是nvarchar类型,不能保证它会转换为datetime(因为它可能包含无效的日期/时间信息)- 因此处理这种情况的一种方法是使用ISDATE,我会在cross apply中使用它。(交叉应用结果是可重复使用的,因此更容易实现输出格式。)
| YOUR_DT | SQL2008 |
|
| 2013-08-29 13:55:48 | 29-08-2013 13:55:48 |
| 2013-08-29 13:55:48 blah | (null) |
| 2013-08-29 13:55:48 rubbish | (null) |
SELECT
[Your_Dt]
, convert(varchar, ca1.dt_converted ,105) + ' ' + convert(varchar, ca1.dt_converted ,8) AS sql2008
FROM your_table
CROSS apply ( SELECT CASE WHEN isdate([Your_Dt]) = 1
THEN convert(datetime,[Your_Dt])
ELSE NULL
END
) AS ca1 (dt_converted)
;
注意:
您还可以使用left([Your_Dt],19)来仅从'2013-08-29 13:55:48 rubbish'中获取类似于'2013-08-29 13:55:48'的字符串。
对于特定的输出,我认为您将需要两个sql 2008日期样式(105&8)sql2012用于比较。
declare @your_dt as datetime2
set @your_dt = '2013-08-29 13:55:48'
select
FORMAT(@your_dt, 'dd-MM-yyyy H:m:s') as sql2012
, convert(varchar, @your_dt ,105) + ' ' + convert(varchar, @your_dt ,8) as sql2008
| SQL2012 | SQL2008 |
|
| 29-08-2013 13:55:48 | 29-08-2013 13:55:48 |