【问题标题】:How to convert or cast INT into a date in SQL Server 18如何在 SQL Server 18 中将 INT 转换或转换为日期
【发布时间】:2021-03-09 22:40:22
【问题描述】:

这不是一个新问题,但适用于 SQL Server 2008 的方法似乎不适用于较新的版本。

我使用了这种方法:

select cast(40835 as datetime)

然后转换为日期 (SQL 2008)

select cast(cast(40835 as datetime) as date)

我尝试了很多方法,但都没有奏效。 有什么想法需要改变吗?

CONVERT(DATETIME, CONVERT(CHAR(8),sm.[scheme_end_date_key] ))AS [scheme_end_date_key]  

 CAST(CAST(sm.[scheme_end_date_key] AS VARCHAR (8)) AS DATETIME) AS [scheme_end_date_key]

然后

 CAST(CAST([scheme_end_date_key] AS DATETIME) AS DATE) AS [scheme_end_date_key]

我得到的错误是:

将表达式转换为数据类型日期时间时出现算术溢出错误。

操作数类型冲突:日期与 int 不兼容

【问题讨论】:

  • 语句 select cast(cast(40835 as datetime) as date) 在 SQL Server 2019 中为我工作,它返回 2011-10-21
  • scheme_end_date_key 的数据类型是什么?如果是 char ,请尝试从表中选择强制转换( CAST(CAST(scheme_end_date_key AS int) AS DATETIME) as date)
  • 40835代表什么?整数不是日期
  • @Charlieface 它利用了有关 SQL Server 日期/日期时间类型实现的秘密知识,即整数部分表示自 1900 年 1 月 1 日以来的天数。但这不是一个安全的假设,因为它没有记录,并且可能在不同的平台上发生变化。
  • @AlwaysLearning 那么更有弹性的dateadd(day, 40835, '1900-01-01')有什么问题@

标签: sql-server datetime


【解决方案1】:

这些整数是 SQL Server 中自“1900-01-01”以来的天数。

你试过了吗?

 select CAST(dateadd(day, 40835, '1900-01-01') AS DATE)

我喜欢它,因为它不那么晦涩难懂。

【讨论】:

  • 不:向“日期时间”列添加值会导致溢出。
  • dbfiddle.uk 提供了在 SQL Server 2014、2016、2017 和 2019 上进行测试的方法。您的公式和此答案中的公式在所有这些版本上都能正常工作。恕我直言,您这边出了点问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多