【问题标题】:T-SQL replacing day and month when setting datetime variable value on SQL Server 2017在 SQL Server 2017 上设置日期时间变量值时,T-SQL 替换日期和月份
【发布时间】:2018-05-16 12:57:39
【问题描述】:

当我设置datetime 变量值时,日期和月份会被切换。

例如:

declare @date datetime = '2017-12-02 14:56:24.000'
select datepart(month,@date)

结果应该是 12 但它是 2。问题只存在于 SQL Server 2017 上。2016 上的相同代码返回 12。

【问题讨论】:

  • 使用对语言或其他连接设置不敏感的格式 - 正如@lad2025 所建议的那样。要更好地理解这一点,请阅读this
  • 你为什么使用 datetime 而不是 datetime2?你不会有这个问题吗?
  • 应该停止使用DATETIME 并使用DATETIME2(n) 数据类型的许多 原因之一 - 在 SQL Server 2008 中引入 - 代替.该数据类型确实 NOT 显示相同的行为 - 日期时间始终按照您的预期正确解释
  • 使用 datetime2 并没有改变我的测试。
  • 是的。使用您接受的答案中的 rextester rextester.com/LDX87286

标签: sql-server tsql datetime sql-server-2016 sql-server-2017


【解决方案1】:

该问题仅存在于 SQL Server 2017 上。2016 上的相同代码返回 12。

它不依赖于 SQL Server 版本,只是不同的DATEFORMAT 设置:

SET DATEFORMAT ymd; 
declare @date datetime = '2017-12-02 14:56:24.000';
select datepart(month,@date);
-- 12

SET DATEFORMAT ydm;
declare @date2 datetime = '2017-12-02 14:56:24.000';
select datepart(month,@date2);
-- 2

Rextester Demo


为避免这种情况,我建议使用独立于文化的 ISO-8601 日期格式。

declare @date datetime = '2017-12-02T14:56:24.000';

Rextester Demo2

marc_s 建议将数据类型更改为DATETIME2

DECLARE @date DATETIME2 = '2017-12-02 14:56:24.000';

Rextester Demo3

【讨论】:

  • 或者只使用DATETIME2(n) 而不是DATETIME - 自 SQL Server 2008 以来的建议 ....
猜你喜欢
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多