将“42978.6736458333”varchar 转换为日期时间

Converting "42978.6736458333" varchar to datetime

我有一个值为 42978.6736458333varchar 列,我想将其转换回正确的 datetime。我进行了大量搜索并尝试了很多建议,但我似乎无法找到适合我所拥有数据的建议。

当我对 sheet 中的所有字段进行连接以插入到我的数据库时,我从 excel 获得了这个值;日期时间列的输出类似于“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]

结果:

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

例如,这里有更多 varchar 个值:

42981.5092361111 
42982.7187615741 
42983.8171527778

上面的尝试return一个value/date,但它是相同的日期,即使我的varchar值增加了。

我希望任何日期时间格式。我真的只想要任何格式的 month/day/year。

这看起来像 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)

尝试

SELECT CAST(42978.6736458333 AS DATETIME)

returns

2017-09-02 16:10:03.000

然而 SQL 服务器使用 01/01/1900 作为纪元,而你的 excel 使用 30/12/1899 或 31/12/1899 作为纪元所以看起来你需要施放后减去 2 天。

例如

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

returns

2017-08-31 16:10:03.000

根据你的评论,我不确定你是如何获得你的价值的 运行

SELECT CAST(42981.5092361111 AS DATETIME)

returns 对我来说

2017-09-05 12:13:18.000