【问题标题】:DateFormat works with constant string value but not with values from a tableDateFormat 适用于常量字符串值,但不适用于表中的值
【发布时间】:2022-02-04 03:42:28
【问题描述】:

设置日期格式 DMY;

select CONVERT(DATETIME,'13/2/2022',103). 它返回 2022-02-13 00:00:00.000。

在表 table_3_2_2022_date_string_format 中,一列包含字符串日期值,如下所示。

  1. nonleadingZeroStringDate
    2022 年 2 月 3 日
    23/12/2022
    2022 年 13 月 3 日

    从 table_3_2_2022_date_string_format 中选择 CONVERT(DATETIME,nonleadingZeroStringDate,103)。

上述脚本捕捉到错误“从字符串转换日期和/或时间时转换失败。”

Microsoft 文档说“SET DATEFORMAT 的设置是在执行或运行时设置的,而不是在解析时设置的。”。它可以解释为什么它失败了?

【问题讨论】:

    标签: tsql type-conversion


    【解决方案1】:

    你在这里使用了两种不同的东西。在同时处理DATEFORMATCONVERT(datetime, [value], ###) 时,我对它们的特性并不十分熟悉,但我相信DATEFORMAT 真的只会改变日期字符串文字的处理方式。

    “文字”是指日期字符串,您没有向 SQL Server 提供有关如何将其转换为日期的任何提示...见下文...

    SET DATEFORMAT mdy
    SELECT ConversionLiteral = CONVERT(datetime, '2/3/2022')        -- 2022-02-03 00:00:00.000
         , ConversionHint    = CONVERT(datetime, '2/3/2022', 103)   -- 2022-03-02 00:00:00.000
    
    SET DATEFORMAT dmy
    SELECT ConversionLiteral = CONVERT(datetime, '2/3/2022')        -- 2022-03-02 00:00:00.000
         , ConversionHint    = CONVERT(datetime, '2/3/2022', 103)   -- 2022-03-02 00:00:00.000
    

    当更改DATEFORMAT 并使用CONVERT() 而不指定样式时,它会随着DATEFORMAT 更改而更改。

    但是当您在CONVERT() 中指定样式时,我相信您是在告诉SQL Server 忽略DATEFORMAT 设置的内容,而是使用样式103,即dd/mm/yyyy

    这就是为什么无论在上面的示例查询中将DATEFORMAT 设置为什么,ConversionHint 的值都不会改变。


    因此,如果您尝试导入格式为dd/mm/yyyy 的字符串,那么使用CONVERT(datetime, [value], 103) 应该会很好。但是如果它试图转换像12/25/2022 这样的东西会抛出一个错误。

    我的建议是……如果您能够使用TRY_CONVERT() 功能。然后运行类似:

    SELECT *
    FROM dbo.MyTable
    WHERE TRY_CONVERT(datetime, [value], 103) IS NULL
        AND [value] IS NOT NULL
    

    这将显示哪些值无法转换。

    【讨论】:

      【解决方案2】:

      我尝试了几乎所有可能的方法,除了添加 0 来表示日期和月份的两位小数。最后,我不得不使用不是原生 SQL 函数的 parse()。

      【讨论】:

        猜你喜欢
        • 2017-01-06
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 2019-12-23
        • 2017-03-25
        • 1970-01-01
        相关资源
        最近更新 更多