由于您的数据是 nvarchar,因此无法保证它会转换为日期时间(因为它可能包含无效的日期/时间信息) - 因此处理此问题的一种方法是使用我将在交叉应用中使用的 ISDATE。 (交叉应用结果是可重用的,因此输出格式更容易。)
| 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' 的字符串
对于该特定输出,我认为您将需要 2 个 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 |