【发布时间】:2020-12-03 18:52:18
【问题描述】:
您能帮我确定我做错了什么还是这是 SQL Server 错误?
我使用的是美国 SQL Server 2016 Enterprise Server。当我设置DATEFORMAT 时,我没有得到预期的结果。请看代码中的cmets。
DECLARE @received varchar(50)
--I expect this to fail, but I get June 11, 2012.
SET DATEFORMAT 'ydm'
SET @received = '11/JUN/12'
SELECT
[month]= DATENAME(month, TRY_CAST(@received as datetime ))
,[day] = DATENAME(day, TRY_CAST(@received as datetime ))
,[year] = DATENAME(year, TRY_CAST(@received as datetime ))
--I expect this to be June 12, 2011, but I get June 11, 2012
SET DATEFORMAT 'ymd'
SET @received = '11/JUN/12'
SELECT
[month]= DATENAME(month, TRY_CAST(@received as datetime ))
,[day] = DATENAME(day, TRY_CAST(@received as datetime ))
,[year] = DATENAME(year, TRY_CAST(@received as datetime ))
关于我为什么尝试验证上述内容而不是使用 2011/06/12 的背景信息: 我们从世界各地、各种仓库管理系统和具有不同程度技术专长的来源获取平面文件中的数据提取。有时我们的客户可以生成数据,而其他时候,他们通过分包合同从系统中获取数据。我们一次处理数百万行。因此,我们尽最大努力以他们提交的格式验证他们提交的日期。要求重新提交非常不方便,而且会花钱和延误。即使我们要求首选格式,我们也并非总是第一次就得到它。
【问题讨论】:
-
我不能告诉你为什么,但这是因为
'11/JUN/12'不是有效的日期格式。如果你使用'11/06/12',你会得到预期的结果。 -
首先不要使用字符串代替日期。使用
date类型的字段和参数。@received不是日期,它是一个可以包含任何内容的字符串,包括potato、4/7/2020和7/4/2020。这三种情况的日期分别是什么时候? -
它没有帮助,但DATEFORMAT 的参数并不意味着在引号中。
-
您为什么认为
/12表示2012 年?为什么不是 2012 年?为什么要在导致 Lloyd's 等主要银行下线的那一年重新引入 Y2K,这是 IT 领域最严重和最昂贵的失败?早在一月份,这是个热门新闻。当事情不可避免地出错时,你甚至不能声称自己无知
标签: sql sql-server datetime try-cast