强制 SQL Server 解析“DDMMYYYY”

Hik*_*ari 5 sql-server date-format sql-server-2012

我正在从一个文件开发 ETL,其中日期以“DDMMYYYY”格式表示,例如“31012016”。

我想获取这个字符串并将它直接传递给将插入数据的 SQL 文本。我不想将它解析为 C# DateTime 然后将其格式化为“YYYY-MM-DD”,以便 SQL Server 再次解析它。

正如我目前所做的那样,日期字符串由 .Net 解析一次,然后由 .Net 格式化并打印在 SQL 代码中,然后由 SQL Server 再次解析。我想从平面文件中获取字符串并将其直接放入 SQL 代码中,无需任何转换。

SQL Server 识别“YYYYMMDD”,但“DDMMYYYY”失败并显示消息:

从字符串转换日期和/或时间时转换失败。

例子:

DECLARE @datevar date = PARSE('31012016' as date using 'pt-BR');  
SELECT @datevar; 
Run Code Online (Sandbox Code Playgroud)

有没有办法让它工作?

我试过了,PARSE('31012016' as date using 'pt-BR')但引发了异常。TRY_PARSE返回空值。还尝试了CAST 和 CONVERT (Transact-SQL)但似乎不存在这种风格。

And*_*y M 14

当日期表示为没有任何分隔符的 8 位数字时,SQL Server 将始终尝试将其解释为YYYYMMDD. 该格式被有意选择为与区域设置或文化无关(实际上也是ISO 8601标准日期格式之一),并且无法让服务器将其解释为DDMMYYYY或以任何其他方式解释。

因此,要么重新排列DDMMYYYY字符串的日期部分以使其YYYYMMDD

CONVERT(
  date,
  SUBSTRING(@datestring, 5, 4) + SUBSTRING(@datestring, 3, 2) + SUBSTRING(@datestring, 1, 2)
)
Run Code Online (Sandbox Code Playgroud)

或插入分隔符以使其匹配已知的分隔 DMY 格式之一,例如DD/MM/YYYY

CONVERT(
  date,
  STUFF(STUFF(@datestring, 5, 0, '/'), 3, 0, '/'),
  103  -- DD/MM/YYYY
)
Run Code Online (Sandbox Code Playgroud)


Mis*_*goo 5

我同意没有直接转换,但这很简单,但是性能会很差,所以坚持一点字符串操作!

    DECLARE @datevar DATE
    SET @datevar = TRY_PARSE(FORMAT(TRY_CAST('31012016' AS INT),'00/00/0000')
                   AS DATE USING 'PT-BR')
    SELECT @datevar;
Run Code Online (Sandbox Code Playgroud)