将nvarchar转换/转换为日期时间

时间:2020-10-01 11:55:53

标签: sql sql-server sql-server-2012 sql-tuning

我有桌子:

id   timestamp
1    31.10.2020 16:32:11
2    09.09.2020 09:15:49
3    22.04.2020 02:48:15

表中有大量这些数据。列时间戳是数据类型“ nvarchar”。而且我需要按日期对数据进行排序或在WHERE子句中按日期进行约束,因此我需要将“时间戳”转换为日期时间。但是我不能。我尝试进行转换和转换,但仍然失败。

有什么建议吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用convert()格式104明确转换为datetime

select convert(datetime, '31.10.2020 16:32:11', 104)

答案 1 :(得分:1)

修复您的设计,然后将列更改为日期和时间数据类型。考虑到您的数据精确到1秒,此处使用datetime2(0)似乎合适。首先,我们需要将nvarchar值的“格式”更改为ISO格式。我们将使用ISO8601格式(yyyy-mm-ddThh:mi:ss.mmm),因为它无歧义:

UPDATE dbo.YourTable
SET [timestamp] = CONVERT(nvarchar(20),TRY_CONVERT(datetime2(0), [timestamp], 4), 126);

现在您可以ALTER表并将数据类型更改为datetime2(0)

ALTER TABLE dbo.YourTable ALTER COLUMN [timestamp] datetime2(0) NULL;

我还建议您为列使用不同于timestamp的名称。 timestamprowversion不推荐使用的同义词,因此它的使用可能会使它非常混乱。尤其是因为rowversion不是日期和时间值,而是binary值和不能转换为日期和时间数据类型。