AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 84790
Accepted
IT researcher
IT researcher
Asked: 2014-12-11 03:40:02 +0800 CST2014-12-11 03:40:02 +0800 CST 2014-12-11 03:40:02 +0800 CST

设置日期格式问题

  • 772

我对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 的设置是在执行或运行时设置的,而不是在解析时设置的。” 这是什么意思?

sql-server sql-server-2008-r2
  • 2 2 个回答
  • 24557 Views

2 个回答

  • Voted
  1. Best Answer
    Thomas Kejser
    2014-12-11T04:04:17+08:002014-12-11T04:04:17+08:00

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

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

    SELECT CAST(0 AS SMALLDATETIME)
    

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

    同样,对于DATETIME:

    SELECT CAST(0 AS DATETIME)
    

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

    有趣的是,这失败了:

    SELECT CAST(0 AS DATE)
    

    例外情况:不允许从数据类型 int 到 date 的显式转换。

    应该很明显,新类型并没有完全充实一些东西。

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

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

    为什么会这样?在数据库引擎内部DATE,DATETIME2并采用与andDATETIMEOFFSET不同的代码路径(您可以使用分析器验证这一点)。因为新的日期格式在很久之后才出现在 SQL Server 代码库中- 不同的程序员在处理它,因此,某些功能不是 100% 对齐的(还)。另一个例子:在 SQL Server 2008R2 的早期版本中,批量加载 a比批量加载 a 慢得多,即使一个比另一个小。这是在发布之前修复的。这种事情发生在一个拥有大量程序员的大组织中。DATETIMESMALLDATETIMEDATETIME/SMALLDATETIMEDATESMALLDATETIME

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

    • 6
  2. Mark Sinkinson
    2014-12-11T04:20:31+08:002014-12-11T04:20:31+08:00

    尽管不是对这个问题的直接回答,但我并不完全相信您链接到的博客文章中显示的示例确实是SET DATEFORMAT.

    您应该使用 的关键原因之一DATEFORMAT是可以以多种方式解释日期。

    如果您为一家全球性企业工作,其日期格式因国家/地区而异,那么使用DATEFORMAT专门设置您期望接收的格式至关重要。

    假设我住在美国并从英国同事那里导入了一个文件。在下面的示例中,导入的日期将根据您的LANGUAGE设置而有所不同。

    CREATE TABLE #tempTable (DateFormatSample DATE, ID INT IDENTITY(1,1));
    
    INSERT INTO #tempTable
    VALUES ('08/07/2007');
    
    INSERT INTO #tempTable
    VALUES ('07/08/2007');
    

    根据我的美国语言设置,这插入:

    DateFormatSample    ID
    2007-08-07           1
    2007-07-08           2
    

    但是,如果我设置DATEFORMAT为英国格式....:

    CREATE TABLE #tempTable (DateFormatSample DATE, ID INT IDENTITY(1,1));
    
    SET DATEFORMAT DMY;
    
    INSERT INTO #tempTable
    VALUES ('08/07/2007');
    
    INSERT INTO #tempTable
    VALUES ('07/08/2007');
    

    我得到一个完全不同的日期和月份:

    DateFormatSample    ID
    2007-07-08           1
    2007-08-07           2
    

    查询不会出错,因为日期是有效的,但是您最终会得到意想不到的结果。您可能每个月都以错误的格式导入整整 12 天的数据,从而使您的系统陷入混乱。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve