Excel SQL 服务器中的文本或一般格式化日期导入和转换
Excel Text or General Formatted Date Import and Conversion in SQL Server
我的同事有一个 excel 作品sheet,在他们将 sheet 导出为制表符分隔的文本文件之前,日期、货币和百分比被格式化为 "General" .这样做是为了捕获所有原始数据并消除格式和舍入。例如,原始值 0.29854 的 30% returns。导出文件导入到 SQL 服务器。
我的问题是日期设置为一个 exell 数字,一旦将其导入 SQL 服务器,我很难将其转换为日期。示例如下:
Date Fmt General Fmt
9/3/2008 39694
7/1/2010 40360
5/4/2011 40667
有谁知道如何将通用格式值作为 varchar 导入 SQL 服务器,然后将其转换回日期?
显而易见的答案是不要将日期格式化为常规日期,但我无法控制此过程,也无法更改它。
我尝试使用 DATEADD() 将日期从 1/1/1900 重新转换。就 a excel 而言,这是日期 1。有关更多信息,请参考以下内容:http://www.exceltactics.com/definitive-guide-using-dates-times-excel/#How-Excel-Stores-Dates
我发现这个解决方案的问题是它休息了两天。
select dateadd(d,39694,'1/1/1900') = 9/5/2008 { should be 9/3/2008 }
select dateadd(dd,40360,'1/1/1900') = 7/3/2010 { should be 7/1/2010 }
select dateadd(dd,40677,'1/1/1900') = 5/6/2011 { should be 5/4/2011 }
我知道这很可能是一个舍入错误,但是否有更好的方法将其转换为在 SQL 服务器中捕获正确的日期?
如果我简单地调整为 DateAdd(d,#####,'12/30/1899') 我确实得到了正确的答案,但在未来的某个地方这也将是一个休息日。我不够聪明,不知道什么时候会发生...
感谢您的帮助。
Excel 日期序列值有点搞砸了。毫无疑问,微软会责怪 Lotus 1-2-3。
给定一个表示从 19000301 开始的日期的 Excel 序列值,您可以减去 2 得到一个整数,SQL 服务器将转换为同一日期的日期时间。
给定一个 Excel 表示 19000101 和 19000228 之间的日期的序列值,您可以减去 1 得到一个整数,SQL 服务器将转换为同一日期的日期时间。
鉴于 Excel 序列值为 60,您应该感到恐慌,因为这代表虚构的日期 19000229。
来源:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27101
(从该论坛上的用户 'X002548' 复制)
我的同事有一个 excel 作品sheet,在他们将 sheet 导出为制表符分隔的文本文件之前,日期、货币和百分比被格式化为 "General" .这样做是为了捕获所有原始数据并消除格式和舍入。例如,原始值 0.29854 的 30% returns。导出文件导入到 SQL 服务器。
我的问题是日期设置为一个 exell 数字,一旦将其导入 SQL 服务器,我很难将其转换为日期。示例如下:
Date Fmt General Fmt
9/3/2008 39694
7/1/2010 40360
5/4/2011 40667
有谁知道如何将通用格式值作为 varchar 导入 SQL 服务器,然后将其转换回日期?
显而易见的答案是不要将日期格式化为常规日期,但我无法控制此过程,也无法更改它。
我尝试使用 DATEADD() 将日期从 1/1/1900 重新转换。就 a excel 而言,这是日期 1。有关更多信息,请参考以下内容:http://www.exceltactics.com/definitive-guide-using-dates-times-excel/#How-Excel-Stores-Dates
我发现这个解决方案的问题是它休息了两天。
select dateadd(d,39694,'1/1/1900') = 9/5/2008 { should be 9/3/2008 }
select dateadd(dd,40360,'1/1/1900') = 7/3/2010 { should be 7/1/2010 }
select dateadd(dd,40677,'1/1/1900') = 5/6/2011 { should be 5/4/2011 }
我知道这很可能是一个舍入错误,但是否有更好的方法将其转换为在 SQL 服务器中捕获正确的日期?
如果我简单地调整为 DateAdd(d,#####,'12/30/1899') 我确实得到了正确的答案,但在未来的某个地方这也将是一个休息日。我不够聪明,不知道什么时候会发生...
感谢您的帮助。
Excel 日期序列值有点搞砸了。毫无疑问,微软会责怪 Lotus 1-2-3。
给定一个表示从 19000301 开始的日期的 Excel 序列值,您可以减去 2 得到一个整数,SQL 服务器将转换为同一日期的日期时间。
给定一个 Excel 表示 19000101 和 19000228 之间的日期的序列值,您可以减去 1 得到一个整数,SQL 服务器将转换为同一日期的日期时间。
鉴于 Excel 序列值为 60,您应该感到恐慌,因为这代表虚构的日期 19000229。
来源:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27101 (从该论坛上的用户 'X002548' 复制)