【问题标题】:SQL Server not accepting YYYY-MM-DDSQL Server 不接受 YYYY-MM-DD
【发布时间】:2022-01-19 15:28:15
【问题描述】:

我的本​​地 SQL Server 2016 设置在重新安装后决定不接受 YMD 日期格式。例如,我同事的设置接受并且仍然接受以下查询:

SELECT "id"  
FROM  test.dbo.tabEmp 
WHERE  "DateAdmission"  <= '2021-12-31' AND "DateAdmission">= '2021-12-30' ` 

当我尝试运行它时,我看到了这个:

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

但是,如果我将日期改写为2021-31-122021-12-30,采用YYYY-DD-MM 格式,它们会被接受。

我无法真正转换或格式化它,因为我们系统中的 sql 查询数量众多,而且几乎不可能做到这一点。有什么可以做的吗?我尝试更改 Windows 的日期格式,但无济于事。

【问题讨论】:

  • 这是否针对在您的设置中本地运行的 SQL 实例?
  • @motosubatsu 是的。
  • 在这种情况下,Sql Server 获取了本地系统的文化日期/时间设置,这与您的同事不同。
  • YYYY-MM-DD 格式不安全。它可能会根据数据库的语言设置错误地解释值。唯一安全的格式是 YYYYMMDD,该格式将始终正常工作。
  • 查看 Aaron Bertrand 的演示。 mssqltips.com/sqlservertutorial/9315/…

标签: sql-server date datetime date-formatting


【解决方案1】:

对于datetimesmalldatetime 数据类型,yyyy-MM-dd 格式不是 明确的(请注意,对于较新的日期和时间数据类型它) .如果您不是美国人,则日期很可能会被解释为yyyy-dd-MM,并且由于一年中没有 31 个月,您会收到错误消息。

对于 SQL Server,无论数据类型和语言设置如何,格式都是明确的yyyyMMddyyyy-MM-ddThh:mm:ss.nnnnnnn;理想情况下,如果您使用的是字符串文字,请使用其中一种格式,因为您永远不会出错(除非您合法地拥有无效的日期)。

否则,您可以使用样式代码明确地CONVERT 您的值:

SELECT CONVERT(datetime, '2021-12-31', 126);

【讨论】:

    【解决方案2】:

    您的新数据库实例似乎在重新安装后采用了新的语言

    当前语言设置决定了所有系统消息使用的语言,以及要使用的日期/时间格式。

    日期格式设置会影响字符串在转换时的解释 用于存储在数据库中的日期值。它不影响日期数据类型值的显示 存储在数据库或存储格式中。

    您可以运行以下语句来返回当前使用的语言:

    SELECT @@LANGUAGE;
    

    这将告诉我们当前的语言是什么以及日期格式(以及其他一些内容):

    DBCC USEROPTIONS;
    

    日期格式可通过以下语句修改:

    SET LANGUAGE us_english;
    SET DATEFORMAT YMD;
    

    这是一篇关于这个主题的好文章:How to Change the Current Date Format in SQL Server (T-SQL)

    还可以一劳永逸地全局修改 SQL Server 实例默认语言:How to change default language for SQL Server?

    【讨论】:

    • 那么有没有一种系统语言可以将其格式化为ymd?我也不能对每个事务都使用 SET 命令,因为查询是由 JDBC 自动运行的...
    • 补充一点,重要的是安全\登录用户语言很重要,在我认为 DBs 用户很重要之前,我确实更改了系统上的所有语言设置
    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 2010-12-19
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多