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

时间:2019-08-17 15:57:37

标签: sql sql-server datetime varchar converters

我有一个varchar列,值是42978.6736458333,我想将其转换回正确的datetime。我已经搜索了很多,并尝试了许多建议,但是似乎找不到适合我所拥有数据的建议。

当我对工作表中的所有字段进行CONCATENATE插入数据库时​​,我从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值增加,它也是相同的日期

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试

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