为什么 SQL Server 将 GETDATE() 强制转换为 CAST('yyyy-mm-dd')以外的其他值?



我使用SQL Server多年,我想我这里有一件非常奇怪的事情。

当我执行以下 2 个查询时:

SELECT CAST(CAST('2017-03-28' AS DATETIME) AS INT)
SELECT CAST(GETDATE() AS INT), GETDATE()

我得到这些输出:

42820
42821   2017-03-28 20:49:10.360

所以我对此完全一无所知; 2017年3月28日怎么能投到42820,2017年3月28日20:49投到42821?

为了让它更奇怪一点,我已经发现更高 1 的点是上午 12:00。我真的迷路了...

有人可以开导我吗?

这是一个有趣的功能...不过,您可以通过先投射浮动来绕过它。

select cast(cast('20170328' as datetime) as int)
select convert(int,convert(float,getdate()))

Rextester 演示:http://rextester.com/YVXUJ72002

两者都返回42820

投射日期时间从 12:00:00 开始四舍五入

SELECT CAST(CAST('2017-03-28 12:00:00' AS DATETIME) AS INT)
SELECT CAST(GETDATE() AS INT), GETDATE()

SELECT CAST(CAST('2017-03-28 11:59:59' AS DATETIME) AS INT)
SELECT CAST(GETDATE() AS INT), GETDATE()

好的。很清楚它是如何工作的。但这对我来说是全新的。

四舍五入为一天:

--00:00:00~12:00:00
SELECT CAST(CAST('1900-01-01 00:00:00' AS DATETIME) AS INT) 
--12:00:00~24:00:00
SELECT CAST(CAST('1900-01-01 12:00:00' AS DATETIME) AS INT) 
--00:00:00.000~11:59:59.994
SELECT CAST(CAST('1900-01-01 11:59:59.994' AS DATETIME) AS INT) 
--11:59:59.995~23:59:59.999
SELECT CAST(CAST('1900-01-01 23:59:59.999' AS DATETIME) AS INT) 

最新更新