【问题标题】:Cast/Convert nvarchar to datetime将 nvarchar 转换/转换为日期时间
【发布时间】:2021-01-17 03:32:37
【问题描述】:

我有桌子:

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 子句中使用按日期进行约束,因此我需要将“时间戳”转换为日期时间。但我不能。我尝试了转换和投射,但仍然失败。

有什么建议吗?

谢谢。

【问题讨论】:

  • 真正的解决方案是修复你的设计; nvarchar 不用于存储日期。
  • 当然,你最好修复数据模型。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    修复您的设计,并将列更改为日期和时间数据类型。考虑到您的数据精确到 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 值并且不能转换为日期和时间数据类型。

    【讨论】:

    • 如果我按照上面的步骤,我的列中只有NULL,对吧?
    • 只有转换失败的值是NULL, @Cesc;但是日期一开始就无效,数据将毫无意义。
    • 哦,是的,对不起。我的错。我认为,一分钟后的格式并不重要。我的专栏看起来完全像这样: '12.01.20 15:34:34, 000000000 EUROPE/PRAGUE' 。我导出了 oracle 表,因此出现了这些问题。
    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多