【问题标题】:Error converting string date format 'yymmdd' to datetime将字符串日期格式“yymmdd”转换为日期时间时出错
【发布时间】:2019-12-14 01:47:36
【问题描述】:

如果我在 SQL Server 中执行以下查询,一切都很好:

SELECT convert(datetime, '580112', 12)

1958-01-12 00:00:00.000

但是当我执行这个查询时:

SELECT TOP 1 [ID]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,CONVERT(datetime, [DateOfBirth],  12)
      ,[address]
      ,[city]
      ,[state]
      ,[zip]
      ,[phoneNumber]
  FROM [dbo].[PF]
GO

我收到以下错误:

Msg 242, Level 16, State 3, Line 7
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

我的数据是这样的:

ID FirstName MiddleName LastName DateOfBirth address city state zip phonenumber
1   100 MARGARET    P   BIGGIO  580112  122 WALTHAM ST  MAYNARD MA          01754 9788971581

编辑:

其他日期同为 yymmdd ISO 格式:

DateOfBirth
531000
481023
500700
500200
570518
411100
580112
510100
840800
671200
680605
681216
430600
470701
470330
630206
470600
710914
620800
590100

DateOfBirth 是 VARCHAR,我必须将其转换为其他内容吗?

【问题讨论】:

  • 您是否尝试过将其转换为日期时间,例如:CONVERT(datetime, cast([DateOfBirth] as datetime), 12)
  • 如果您运行选择查询,但添加“WHERE ID = 1”...会返回一个结果,还是抛出相同的错误?
  • 如果您使用的是 SQL Server 2016 或更高版本,请尝试使用 TRY_CONVERT() 函数来定位您的不良数据。
  • 另外,请注意 SQL Server 的两位数年份行为:“默认情况下,SQL Server 根据截止年份 2049 解释两位数年份。这意味着 SQL Server 解释两位数年份 49如 2049 和两位数的年份 50 作为 1950。许多客户端应用程序,包括基于自动化对象的应用程序,使用截止年份 2030。SQL Server 提供了两位数的年份截止配置选项来更改 SQL Server 使用的截止年份。 " docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 控制截止年份的方法如下:docs.microsoft.com/en-us/sql/database-engine/configure-windows/… 但您需要先了解您的数据,然后才能设置截止年份。

标签: sql-server datetime type-conversion


【解决方案1】:

所以你的数据不正确。

使用以下它可以工作:

declare @tbl as table (ID int primary key identity, FirstName varchar(50), MiddleName varchar(50), LastName varchar(50),DateOfBirth varchar(50),address varchar(50),city varchar(50),state varchar(50),zip varchar(50),phonenumber varchar(50))
insert into @tbl (  FirstName,  MiddleName, LastName, DateOfBirth, address, city, state, zip, phonenumber) values
                (   'MARGARET', 'P',    'BIGGIO','531001','122','WALTHAM ST','MAYNARD MA','01754','9788971581')

select
    [ID]
,   [FirstName]
,   [MiddleName]
,   [LastName]
,   convert(datetime, [DateOfBirth],  12)   DateOfBirth
,   [address]
,   [city]
,   [state]
,   [zip]
,   [phoneNumber]
from @tbl

但是当日期改成531000时,SQL就无法读取了。

更正数据,然后您的查询就可以工作了。

【讨论】:

    【解决方案2】:

    @bsteo 出现上述问题是因为日期值不能为 00,所以出现错误的原因请参见下面的差异。

    SELECT convert(datetime, '500700', 12)
    
    Msg 242, Level 16, State 3, Line 3
    The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
    

    与 01 日期相同的值

    SELECT convert(datetime, '500701', 12)
    
    1950-07-01 00:00:00.000
    

    检查差异..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多