【问题标题】:convert a date from a string into a new date field将日期从字符串转换为新的日期字段
【发布时间】:2018-07-08 07:26:43
【问题描述】:

我有一个从 Excel 导入 SQL Server 2012 的表,该表拒绝作为日期字段导入。它以 VarChar 的形式出现,看起来像“03/15/2017”。所以我所做的是在表格中创建一个新的日期字段,现在我只想用文本的日期版本填充该字段。

我写了这个小更新代码来做到这一点:

update [dbo].[Sheet5$]
set TDate = CAST(SUBSTRING([Date], 7, 4) + '/' + SUBSTRING([Date], 1, 2) + '/' 
    + SUBSTRING([Date], 4, 2) AS DATETIME)

它给了我一个错误:

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

谁能告诉我我做错了什么,以及如何解决它,以便我可以将这些日期输入日期字段?

【问题讨论】:

  • 可能是区域设置不同,也可能是该列中有无效日期的值。您可以使用TRY_CONVERT - SELECT [Date] FROM [dbo].[Sheet5$] WHERE TRY_CONVERT(DATE, [Date], 101) IS NULL 识别有问题的行 - 在这里您不会收到错误输入的错误,使用CONVERT 而不是CAST 您可以指定样式(在本例中为 101),以便转换函数知道期望格式为 MM/dd/yyyy 的日期

标签: sql-server date type-conversion


【解决方案1】:

如果 2012+ 使用 try_convert()format()。如果您有虚假或格式错误的数据,它不会引发错误。

示例

Declare @YourTable Table ([Date] varchar(50))
Insert Into @YourTable Values 
 ('03/15/2017')
,('3/15/2017')
,('3/7/2017')
,('22/7/2017')

Select *
      ,AsDate   = try_convert(date,[Date]) 
      ,AsString = format(try_convert(date,[Date]),'MM/dd/yyyy')
 From @YourTable

退货

Date        AsDate      AsString
03/15/2017  2017-03-15  03/15/2017
3/15/2017   2017-03-15  03/15/2017
3/7/2017    2017-03-07  03/07/2017
22/7/2017   NULL        NULL

【讨论】:

  • 完美运行,谢谢!
  • @JohnnyBones 乐于助人
【解决方案2】:

您的表中某处有一些无效数据。如果您使用的是 2012 年或更高版本,则可以使用 TRY_CONVERT 或 TRY_PARSE 而不是 CAST。您也不需要其中的 / 字符。 ANSI 支持的格式是 YYYYMMDD。

update [dbo].[Sheet5$]
set TDate = TRY_CONVERT(SUBSTRING([Date], 7, 4) + SUBSTRING([Date], 1, 2) + SUBSTRING([Date], 4, 2) AS DATETIME)

然后您可以查看 TDate IS NULL 的行并找出这些行无效的原因并修复数据。

【讨论】:

  • 谢谢。虽然约翰的回答同样有效,但我给了这个复选标记,因为它指出存在错误数据。确实,有人输入了 2017 年 6 月 31 日,但没有 6 月 31 日。
  • 6 月 31 日有一个:https://en.wikipedia.org/wiki/31_June。谁没有听说过著名的俄罗斯电视奇幻音乐剧?! ;)
  • 请记住,如果值无法转换,这将在没有警告的情况下插入 NULL 值。最好先使用“select * where try_convert... is null”查找无法转换为日期的数据。
  • @Christian4145 显然他们已经在表中有 NULL 并且正在尝试更新它。在此之前或之后检查以修复源数据很容易。
猜你喜欢
  • 2021-07-14
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多