为啥 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无法正确连接
为啥 object dtype 数组包含 datetime.datetime 对象而不是 numpy.datetime64 对象?