为啥 LEFT(Datetime,1) 给我“J”?

Posted

技术标签:

【中文标题】为啥 LEFT(Datetime,1) 给我“J”?【英文标题】:Why does LEFT(Datetime,1) give me "J"?为什么 LEFT(Datetime,1) 给我“J”? 【发布时间】:2017-06-14 14:26:14 【问题描述】:

所以我正在编写一个 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

【问题讨论】:

如果你在 12 月的时间戳上这样做,你会得到 D。;) 【参考方案1】:

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

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)

【讨论】:

如果你把“1”改成“25”就可以看到了。 @JohnPasquet 同意,我只是想说明日期时间到完整值的隐式转换。 明白了......只是添加了那个花絮。 我在发布这个问题后离开时意识到LEFT 将所有日期转换为 2017 年 6 月 14 日,所以最左边的字符始终是 J。我应该意识到早点。 @Mike 发生在我们当中。 :)

以上是关于为啥 LEFT(Datetime,1) 给我“J”?的主要内容,如果未能解决你的问题,请参考以下文章

3-5 回顾,快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准点

bootstrap datetimepicker 重新初始化之后,日期为啥会变为1899年

使用datetime列的r dplyr :: left_join无法正确连接

为啥 C# 提前 7 小时解析 DateTime?

为啥 object dtype 数组包含 datetime.datetime 对象而不是 numpy.datetime64 对象?

为啥 SQL Server DATETIME 类型可以节省 1/300 秒的时间?