SET DATEFORMAT 问题

IT *_*her 3 sql-server t-sql sql-server-2008-r2 date-format

我对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
Run Code Online (Sandbox Code Playgroud)

3) 提到“SET DATEFORMAT 的设置是在执行或运行时设置的,而不是在解析时设置的”。这是什么意思?

Tho*_*ser 6

1) SET DATEFORMAT 对表的实际存储没有影响。它仅用于格式化输出和解释字符串。在幕后,所有日期格式都以规范格式存储为整数。

数据类型的实际表示取决于使用的类型。例如,SMALLDATETIME是一个整数,用于存储自 1900-01-01 以来的秒数。当您像这样铸造时,其中一些气泡会浮出水面:

SELECT CAST(0 AS SMALLDATETIME)
Run Code Online (Sandbox Code Playgroud)

结果:1900-01-01 00:00:00

同样,对于DATETIME

SELECT CAST(0 AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

结果:1900-01-01 00:00:00.000

有趣的是,这失败了:

SELECT CAST(0 AS DATE)
Run Code Online (Sandbox Code Playgroud)

有例外:不允许从数据类型 int 显式转换为 date。

很明显,新类型并没有使某些东西变得充实。

2)此限制记录在此处:http : //msdn.microsoft.com/en-gb/library/ms189491.aspx

date、datetime2 和 datetimeoffset 数据类型不支持 DATEFORMAT ydm。

为什么会这样?里面的数据库引擎DATEDATETIME2并且DATETIMEOFFSET需要比不同的代码路径DATETIMESMALLDATETIME(你可以用一个探查验证这一点)。因为新的日期格式在很久之后才出现在 SQL Server 代码库中DATETIME/SMALLDATETIME- 不同的程序员致力于它,因此,某些功能还没有 100% 对齐(还)。另一个例子:在 SQL Server 2008R2 的早期版本中,批量加载 aDATE比批量加载 a 慢得多SMALLDATETIME,即使一个比另一个小。这是在发布前修复的。这是在拥有大量编码员的大型组织中发生的事情。

3) 这意味着在您实际尝试之前,您不可能知道日期格式是否有效。在您的情况下,这意味着即使您在没有执行的情况下执行“显示查询计划”,在您实际执行查询之前,您也不会知道格式存在错误。

  • @ITresearcher NO。日期不会像您建议的那样以任何友好的字符串格式存储。这只是它们可能通过客户端应用程序(如 SSMS)或通过提供程序(如 OLEDB/ODBC)向您表示的方式。 (2认同)