【问题标题】:Import date values in Sql Server with import packages使用导入包在 Sql Server 中导入日期值
【发布时间】:2012-07-29 07:41:54
【问题描述】:

我在使用 Sql Server 中的 Visual Studio 导入数据时遇到了一个烦人的问题。我使用 Visual Studio 创建了一个 SSIS 导入包来导入 Excel 文件 (.xlsx)。我导入的工作表有一列填充了 datetype 值。有些值是左对齐的,有些是右对齐的。如果我将整个列格式化为日期类型,我仍然会在该列上获得两种不同类型的对齐方式:例如2011 年 4 月 1 日是右对齐,2011 年 13 月 1 日是左对齐。 我为该列导入带有 nvarchar 的文件,我得到左对齐值的 NULL 值。 如果我为该列导入具有 datetime 数据类型的文件,我会得到右对齐的 NULL 值。

我不关心我的 Sql 数据库中的信息是如何“登陆”的,无论是 nvarchar 还是 datetime,但我需要完整的信息,没有 NULLS。这似乎主要是一个 Excel 问题,因为 Excel 不会将这些值视为相同的数据类型,因此存在不同类型的对齐。请问有什么建议吗?感谢任何建议/建议。谢谢。

【问题讨论】:

    标签: sql sql-server excel visual-studio-2008


    【解决方案1】:

    我认为你有两个问题。一,右对齐的值被解释为日期,但它们是错误的,因为 Excel 认为它们是 m/d/yyyy 而你想要 d/m/yyyy。二,左对齐的值被解释为文本。

    不幸的是,当数据已经存在时对列应用格式不会改变底层存储。由于 Excel 已经将数据弄乱了,因此您需要自己解析出正确的值。

    上述每个问题都需要不同的解决方案。这是一个视觉效果,显示了我如何分解问题和相应的修复:

    首先注意columns A, D, E, F 中提到的日期格式。这就解释了为什么 2011 年 4 月 1 日的“固定”版本看起来与源代码相同。事实上,固定版本是 1 月 4 日,而源是 4 月 1 日。

    这是流程和公式:

    B 列和 C 列是助手。他们希望简化column D 中的修复。这里的错误无关紧要;它们将在最后一步被忽略:

    B3: =FIND("/",A3)
    C3: =FIND("/",A3,B3+1)
    

    D 列通过解析数字在斜线中的位置并构建日期值来处理解释为文本的数据。您不需要这个,但为了清楚起见,我将其展示出来:

    D3: =DATE(RIGHT(A3,4),MID(A3,B3+1,C3-B3-1),LEFT(A3,B3-1))
    

    E 列处理解释为日期但 d 和 m 颠倒的数据。同样,不需要,但为了清楚起见:

    E3: =DATE(YEAR(A3),DAY(A3),MONTH(A3))
    

    F 列将 D 和 E 与 IF 结合在一起,以应用适当的修复:

    F3: =IF(ISERROR(VALUE(A3)),DATE(RIGHT(A3,4),MID(A3,B3+1,C3-B3-1),LEFT(A3,B3-1)),DATE(YEAR(A3),DAY(A3),MONTH(A3)))
    

    【讨论】:

    • 另一个选项是选择A列并选择数据|文本到列|固定宽度|下一个|下一个|日期:DMY完成。然后将数字格式化为 DMY 格式。如果需要,可以将目标设置为另一列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多