为什么LEFT(Datetime,1)给我"J"?

Mik*_*ike 3 sql t-sql sql-server datetime

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

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

我将它缩小到a 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.

所以我的问题是为什么采用LEFTDateTime 的第一个字符给出J输出?

Joh*_*tti 6

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

Select cast(getdate() as varchar(25))
      ,left(getdate(),1)
Run Code Online (Sandbox Code Playgroud)

返回

(No column name)      (No column name)
Jun 14 2017 10:28AM   J
Run Code Online (Sandbox Code Playgroud)

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

只是为了好玩,试试吧

Select left(25,1)
Run Code Online (Sandbox Code Playgroud)