SQL Server:将datetime字符串转换为十进制并匹配Excel

时间:2017-07-14 16:20:06

标签: sql-server excel datetime

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

我正在尝试将日期字符串转换为十进制值,并将该值与Excel提供的值相匹配。从SQLFiddle中,一些值匹配,但稍后在列表中,它会被一个值关闭。

我尝试了两种不同的方法,仍然无法找到合适的组合来获得与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

2 个答案:

答案 0 :(得分:0)

我认为你会发现一个人关闭的值是1900年3月1日之前的日期。

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

答案 1 :(得分:0)

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

诀窍是将日期时间转换为浮点数并添加2, HOWEVER ,如果日期小于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)

<强>返回

enter image description here