【问题标题】:SQL Server : convert nvarchar to dateSQL Server:将 nvarchar 转换为日期
【发布时间】:2019-12-03 16:38:32
【问题描述】:

如何将类似于 DD.MM.YYYY 的数据类型为 nvarchar 的字符串列转换为 Date 类型。

我需要最简单的Date 类型(不需要时钟时间),所以我可以将此列视为日期。

谢谢!

编辑:我尝试了所有推荐的方法,但它不起作用

UPDATE [test3]
SET [column3] = CONVERT(NVARCHAR(50), CONVERT(SMALLDATETIME, [column2], 105))

ALTER TABLE [test3]
ALTER COLUMN [column3] SMALLDATETIME

错误:

将 nvarchar 数据类型转换为 smalldatetime 数据类型导致值超出范围。

【问题讨论】:

  • 当您研究如何做到这一点时,您在 Google 中使用了哪些搜索词?
  • 这能回答你的问题吗? Converting NVARCHAR(255) to DATE
  • 查看here 并选择可以转换为您喜欢的格式的数字。德国 104 似乎很有前途?
  • 我试过 CONVERT 和 CAST ,要么不行。另外,日期格式无关紧要,只有将此列视为日期的选项,所以我可以搜索特定的日期或期间

标签: sql sql-server


【解决方案1】:

如果你想转换成 dd.mm.yyyy 那么你可以像下面这样使用:

select convert(varchar, getdate(), 104)

但在您的情况下,您可以将 nvarchar 转换为日期,如下所示:

select convert(date, yourdate)

【讨论】:

  • 您仍然需要传递样式参数以消除区域歧义。例如(我在美国): SELECT CONVERT(DATE,'03.12.2019') 返回 '2019-03-12' 而 SELECT CONVERT(DATE,'03.12.2019',104) 返回 '2019-12- 03'
【解决方案2】:

根据你的编辑和你所说的你想要的,你似乎做事有点乱,而且我不知道你为什么在你只想要 DATE 的时候使用 SMALLDATETIME,但是没关系。

我假设您的表有 [column2] 类型的 VARCHAR 数据,看起来像 DD.MM.YYYY 您希望将其视为日期而不是字符串。

首先,创建一个列来保存日期信息:

ALTER TABLE [test3] ADD [column3] DATE

然后您可以通过转换字符串数据来填充新列:

UPDATE [test3] SET [column3] = CONVERT(DATE, [column2], 104)

此外,格式绝对重要,因为在美国,“03.12.2019”将转换为 3 月 12 日而不是 12 月 3 日。如果您假设您的服务器的区域设置正确,那么您可能会弄得一团糟。

【讨论】:

  • 感谢帮助,这正是我所做的(顺便说一句,column2 是 Nvarchar)仍然错误:“从字符串转换日期和/或时间时转换失败。” ;我试过 Date tye 和 smallDateTime。
【解决方案3】:

如果转换列中的数据有问题?
然后首先发现并纠正错误的数据,或以意外的格式。

要找到它们,您可以使用TRY_CONVERT 这与普通的CONVERT 相同。
但是如果转换失败,TRY_CONVERT 不会抛出错误,而是简单地输出 NULL。

SELECT TOP 1000 [column2], [column3]
FROM [test3]
WHERE TRY_CONVERT(DATE, [column2], 104) IS NULL
  AND [column2] IS NOT NULL;

一旦您发现数据中的麻烦制造者并加以纠正?
然后更新应该工作。

UPDATE [test3]
SET [column3] = CONVERT(VARCHAR(10), CONVERT(DATE, [column2], 104), 23);

之后可以更改column3的类型。

ALTER TABLE [test3]
  ALTER COLUMN [column3] DATE;

或者先将所有column3设置为NULL,然后做type change,然后从column2更新。

UPDATE [test3]
SET [column3] = NULL;
WHERE [column3] IS NOT NULL;

ALTER TABLE [test3]
  ALTER COLUMN [column3] DATE;

UPDATE [test3]
SET [column3] = CONVERT(DATE, [column2], 104);
WHERE [column2] IS NOT NULL;

【讨论】:

  • 谢谢!! [test3] 只是我创建的小测试表,用于在真正的大表之前尝试该过程。我不小心使用了无法转换的 30.02。现在它可以正常工作了!感谢!
  • 太棒了!是的,有时对数据的假设会导致麻烦。顺便说一句,要更改 column3,还有另一种选择。首先将 column3 全部更新为 NULL,更改 column3 的类型,然后从 column2 进行更新。
【解决方案4】:

如果您收到“从字符串转换日期和/或时间时转换失败”错误

您收到此错误的原因是:

如果你这样做:

select convert (date, '2021-12-30', 23) as datum

因为 23 是 yyyy-mm-dd 格式,例如:2006-12-30 它可以正常工作。

但如果你这样做:

select convert (date, '2021-12-30', 104) as datum

由于 104 是 dd.mm.yyyy 格式,比如 30.12.2006,你会得到错误:

[S0001][241] 第 1 行:转换日期和/或时转换失败 字符串的时间。

【讨论】:

    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2011-09-01
    • 2012-04-29
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多