我对SET DATEFORMAT命令有一些疑问。
1)此命令是否仅用于插入和更新日期格式,不影响该列的日期格式?或者在插入值后这是否会影响我的表格?
2)我尝试使用以下命令(用于日期数据类型)并得到类似的错误This session's YDM date format is not supported when converting from this character string format to date, time, datetime2 or datetimeoffset. Change the session's date format or provide a style to the explicit conversion.
。为什么日期数据类型出现错误(对于 smalldatetime,它的工作原理如链接所示)?
CREATE TABLE #tempTable (DateFormatSample DATE)
SET DATEFORMAT MDY
INSERT INTO #tempTable
VALUES ('09/28/2007')
SET DATEFORMAT YDM
INSERT INTO #tempTable
VALUES ('2007/28/09')
SET DATEFORMAT YMD
INSERT INTO #tempTable
VALUES ('2007/08/28')
SELECT DateFormatSample
FROM #tempTable
DROP TABLE #tempTable
3)有人提到“SET DATEFORMAT 的设置是在执行或运行时设置的,而不是在解析时设置的。” 这是什么意思?
1) SET DATEFORMAT 对表的实际存储没有影响。它仅用于格式化输出和解释字符串。在幕后,所有日期格式都以规范格式存储为整数。
数据类型的实际表示取决于所使用的类型。例如,
SMALLDATETIME
是一个整数,它存储自 1900-01-01 以来的秒数。当您像这样投射时,其中一些气泡会浮出水面:结果:1900-01-01 00:00:00
同样,对于
DATETIME
:结果:1900-01-01 00:00:00.000
有趣的是,这失败了:
例外情况:不允许从数据类型 int 到 date 的显式转换。
应该很明显,新类型并没有完全充实一些东西。
2) 此处记录了此限制:http: //msdn.microsoft.com/en-gb/library/ms189491.aspx
为什么会这样?在数据库引擎内部
DATE
,DATETIME2
并采用与andDATETIMEOFFSET
不同的代码路径(您可以使用分析器验证这一点)。因为新的日期格式在很久之后才出现在 SQL Server 代码库中- 不同的程序员在处理它,因此,某些功能不是 100% 对齐的(还)。另一个例子:在 SQL Server 2008R2 的早期版本中,批量加载 a比批量加载 a 慢得多,即使一个比另一个小。这是在发布之前修复的。这种事情发生在一个拥有大量程序员的大组织中。DATETIME
SMALLDATETIME
DATETIME/SMALLDATETIME
DATE
SMALLDATETIME
3) 这意味着在您实际尝试之前,您不可能知道日期格式是否有效。在您的情况下,这意味着即使您在不执行的情况下执行“显示查询计划”,在您实际执行查询之前,您也不会知道格式存在错误。
尽管不是对这个问题的直接回答,但我并不完全相信您链接到的博客文章中显示的示例确实是
SET DATEFORMAT
.您应该使用 的关键原因之一
DATEFORMAT
是可以以多种方式解释日期。如果您为一家全球性企业工作,其日期格式因国家/地区而异,那么使用
DATEFORMAT
专门设置您期望接收的格式至关重要。假设我住在美国并从英国同事那里导入了一个文件。在下面的示例中,导入的日期将根据您的
LANGUAGE
设置而有所不同。根据我的美国语言设置,这插入:
但是,如果我设置
DATEFORMAT
为英国格式....:我得到一个完全不同的日期和月份:
查询不会出错,因为日期是有效的,但是您最终会得到意想不到的结果。您可能每个月都以错误的格式导入整整 12 天的数据,从而使您的系统陷入混乱。