为什么LEFT(日期时间,1)给我" J"?

时间:2017-06-14 14:26:14

标签: sql sql-server tsql datetime

所以我写了一个SQL查询,它给了我一个奇怪的错误:

  

转换varchar值时转换失败' J'到数据类型int

我把它缩小到LEFT(ProjApprovelDate,1),这出于某种原因给了我一个J.

ProjApprovelDate大部分时间都是一个DateTime,有一些实例输入不正确,而是一个int。为了找到这些,我使用了(LEFT(ap.ApprovalDate,1) != 1 and LEFT(ap.ApprovalDate,1) != 2)。如果格式错误,它始终以1或2开头。整个列(在原始表中)是int格式,并显示大多数日期,如20170614,但有几个显示像1170614。我将这些转换为正确的格式并将它们全部插入到一个新表中,并将此列作为DateTime,以便正确地将它们转换为日期。

在审核以确保我得到它们时,我发现这个有趣的案例,那些已经正确格式化为DateTime的案例给了我一个J.

所以我的问题是为什么采用DateTime的第一个LEFT字符为输出提供J

1 个答案:

答案 0 :(得分:6)

隐式转换是一个字符串,所以......

Select cast(getdate() as varchar(25))
      ,left(getdate(),1)

<强>返回

(No column name)      (No column name)
Jun 14 2017 10:28AM   J

查看https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine

只是为了好玩,试试

Select left(25,1)