【问题标题】: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。;)

标签: sql sql-server tsql datetime


【解决方案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 发生在我们当中。 :)
猜你喜欢
  • 2023-03-30
  • 2022-01-14
  • 2014-02-11
  • 2010-11-11
  • 2017-04-15
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多