【问题标题】:Converting "42978.6736458333" varchar to datetime将“42978.6736458333”varchar 转换为日期时间
【发布时间】:2019-12-23 13:20:59
【问题描述】:

我有一个varchar 列,其值为42978.6736458333,我想将其转换回正确的datetime。我进行了相当多的搜索并尝试了许多建议,但我似乎找不到适用于我拥有的数据的建议。

当我对工作表中的所有字段进行连接以插入我的数据库时,我从 excel 中获得了这个值; datetime 列的输出看起来像“42978.6736458333”(单元格最初包含“2017-08-31 16:10:03”)。我在excel中尝试了格式化和各种东西都无济于事。

以下是我尝试过的一些示例:

Select
    convert(varchar(23), date, 112) DATE1,
    convert(datetime, '20160805') DATE2,
    convert(datetime, '2011-09-28 18:01:00', 120) DATE3,
    dateadd(second, 42978.6736458333 * 24*24*60, '1899-12-31') DATE4
From 
    [dbo].[trainingLog]

结果:

  • 日期 1 = 42978.6736458333
  • 日期 2 = 2016-08-05 00:00:00.000
  • 日期 3 = 2011-09-28 18:01:00.000
  • 日期 4 = 1947-01-25 11:16:01.000

对于每一个结果。即使原始日期时间varchar 递增,DATE 2/3/4 也不会计数。

例如,这里有更多varchar 值:

42981.5092361111 
42982.7187615741 
42983.8171527778

上述尝试返回一个值/日期,但它是相同的日期,即使我的 varchar 值增加了。

我期望任何日期时间格式。我真的只想要任何格式的月/日/年。

【问题讨论】:

  • 你为什么将日期和时间存储为数字,首先存储为varchar?这就像双重失礼。 '42978.6736458333' 甚至代表什么日期?
  • 这并不是 mu 真正的愿望。这就是它来自excel的方式。原始单元格包含“2017-08-31 16:10:03”。
  • 我认为,您需要delete SQL 中插入的记录,并再次从 excel 中输入 insert,然后在 excel 中进行连接之前,将列格式更改为 excel 中的文本,即 20170831 然后在 SQL 中很容易投射
  • @ShekarKola 我在连接之前确实这样做了;我尝试了文本和所有日期格式并得到了相同的结果。
  • @ShekarKola datetime 在小数点之前的零日期 (1900-01-01) 和小数点之后的天数为全天的一小部分。因此,float 值可以转换为 datetime

标签: sql sql-server datetime varchar converters


【解决方案1】:

试试

SELECT CAST(42978.6736458333 AS DATETIME)

返回

2017-09-02 16:10:03.000

但是 SQL Server 使用 01/01/1900 作为纪元,而您的 excel 使用 30/12/1899 或 31/12/1899 作为纪元,因此看起来您需要在投射后减去 2 天的休息时间。

例如

SELECT dateadd(d, -2, CAST(42978.6736458333 AS DATETIME) )

返回

2017-08-31 16:10:03.000

根据您的评论,我不确定您如何获得跑步的价值

SELECT CAST(42981.5092361111 AS DATETIME)

为我退货

2017-09-05 12:13:18.000

【讨论】:

  • 确实如此;问题是它为每个 varchar 值返回相同的结果,即使 varchar 值递增。更多值可查看:>42981.5092361111 >42982.7187615741 >42983.8171527778
  • 对不起,你在这里一点都不清楚,我不明白你的问题是什么,因为你一直在改变你的问题!我建议问一个清晰简洁的问题,具体是什么问题以及几个示例的预期结果。 HTH
  • 抱歉还是不清楚,对我来说图片看起来正确,三个不同的日期按预期返回
  • @Rippo 我得到的返回值与您在上面所做的相同。在我最初的问题中,上述所有示例都提供了一个值,但即使 DATE1 递增,它也是返回的 same 值。 42978.**6736458333**>2017-09-02 16:10:03.000 & 42981.**5092361111**>2017-09-02 16:10:03.000 varchar 值发生变化,但返回值相同。这就是问题所在。
  • @GSerg 之前错过了,我是个白痴。
【解决方案2】:

这看起来像是 Excel 时间。所以:

select dateadd(minute, 42978.6736458333 * 24*60, '1899-12-31')

如果你尝试使用秒,你会得到一个溢出错误。如果秒很重要,您可以这样做:

select dateadd(day, floor(42978.6736458333), '1899-12-31') +
      dateadd(second, (42978.6736458333 % 1)*24*60*60, 0)

【讨论】:

  • 我只关心日/月/年(任何格式)。问题是即使varchar(DATE1)递增,它也会为每个结果返回相同的值:>42981.5092361111>42982.7187615741>42983.8171527778
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多