将Excel日期序列号转换为常规日期

Sre*_*har 21 sql t-sql sql-server ssis etl

我的csv文件中有一个名为DateOfBirth的列,带有Excel Date Serial Number Date

例:

      36464
      37104
      35412
Run Code Online (Sandbox Code Playgroud)

当我在Excel中格式化单元格时,这些单元格被转换为

      36464 => 1/11/1999
      37104 => 1/08/2001
      35412 => 13/12/1996
Run Code Online (Sandbox Code Playgroud)

我需要在SSIS或SQL中进行这种转换.怎么能实现这一目标?

Nic*_*aid 33

在SQL中:

select dateadd(d,36464,'1899-12-30')
-- or thanks to rcdmk
select CAST(36464 - 2 as SmallDateTime)
Run Code Online (Sandbox Code Playgroud)

在SSIS中,请看这里

http://msdn.microsoft.com/en-us/library/ms141719.aspx


Jac*_*ago 14

标记的答案不正常,请将日期更改为"1899-12-30"而不是"1899-12-31".

select dateadd(d,36464,'1899-12-30')
Run Code Online (Sandbox Code Playgroud)


Ric*_*uza 9

您可以将其强制转换为SQL smalldatetime:

cast(41869 - 2 as smalldatetime)
Run Code Online (Sandbox Code Playgroud)

SQL Server计算其日期从01/01/1900和Excel从12/30/1899 = 2天.

  • 仅供参考:减少2天的问题比不正确的评估更有趣.盖茨先生自己批准了日期的怪异.请参阅以下两个资源:[MS Support](https://support.microsoft.com/en-us/kb/214326),[真实故事](http://www.joelonsoftware.com/items/2006/06 /16.html)是的,Stack Overflow的创建者确实在整个事情中发挥了巨大的作用. (2认同)

Tim*_*ner 9

总而言之:

select cast(@Input - 2e as datetime)
Run Code Online (Sandbox Code Playgroud)

解释:

Excel 将日期时间存储为浮点数,表示自 20 世纪初以来经过的时间,而 SQL Server 可以以相同的方式轻松在浮点数和日期时间之间进行转换。Excel 和 SQL Server 将此数字转换为日期时间之间的差异为 2 天(截至 1900-03-01,即)。使用字面量2e来表示这种差异会通知 SQL Server 将其他数据类型隐式转换为浮点型,以实现非常输入友好且简单的查询:

select
    cast('43861.875433912' - 2e as datetime) as ExcelToSql, -- even varchar works!
    cast(cast('2020-01-31 21:00:37.490' as datetime) + 2e as float) as SqlToExcel

-- Results:
-- ExcelToSql                          SqlToExcel
-- 2020-01-31 21:00:37.490        43861.875433912
Run Code Online (Sandbox Code Playgroud)


小智 5

这实际上为我工作

dateadd(mi,CONVERT(numeric(17,5),41869.166666666664)*1440,'1899-12-30') 
Run Code Online (Sandbox Code Playgroud)

(该日期再减去1天)

指负面评论帖子