【问题标题】:SQL Server: Convert datetime string to decimal and match ExcelSQL Server:将日期时间字符串转换为十进制并匹配 Excel
【发布时间】:2017-07-14 16:20:06
【问题描述】:

http://sqlfiddle.com/#!6/a694d/10

我正在尝试将日期字符串转换为十进制值,并且该值与 Excel 给出的值相匹配。从 SQLFiddle 中,一些值匹配,但后来在列表中它偏离了一个。

我尝试了 2 种不同的方法,但仍然找不到正确的组合来获得与 excel 生成的数字相匹配的数字。

这是我正在运行的查询(来自 SQLFiddle):

SELECT 
date_as_nvarchar_max
,excel_value_as_number
,cast((cast(date_as_nvarchar_max as datetime)-'1899-12-30T00:00:00')AS NUMERIC(10, 2)) as test1
,cast((cast(date_as_nvarchar_max as datetime)-'1899-12-31T00:00:00')AS NUMERIC(10, 2)) as test2
,datediff(day, '1899-12-30T00:00:00', date_as_nvarchar_max) as test3
,datediff(day, '1899-12-31T00:00:00', date_as_nvarchar_max) as test4

FROM EXCEL_DATES

【问题讨论】:

    标签: sql-server excel datetime


    【解决方案1】:

    我想您会发现相差 1 的值是 1900 年 3 月 1 日之前的日期。

    这是因为Excel incorrectly assumes that the year 1900 is a leap year

    【讨论】:

      【解决方案2】:

      我将cross apply 中的date_as_nvarchar_max 转换为datetime 只是为了更清晰的说明

      诀窍是将日期时间转换为浮点数并加 2,但是,如果日期小于 1900-03-01,则加 1

      示例

      SELECT A.*
            ,Calculated = convert(float,B.D)+IIF(B.D < '1900-03-01',1,2)
      FROM EXCEL_DATES A
      Cross Apply (values (convert(datetime,date_as_nvarchar_max)) ) B (D)
      

      退货

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 2018-08-10
        相关资源
        最近更新 更多