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)
我同意没有直接转换,但这很简单,但是性能会很差,所以坚持一点字符串操作!
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)