当前位置:首页 > 问答 > 正文

MSSQL里怎么搞时间那点事儿,教你几招拿到服务器时间

(来源:CSDN博客《SQL Server获取当前时间的方法总结》) 在MSSQL里折腾时间,第一件要紧事就是搞清楚服务器现在几点,你别笑,这事儿还真没那么简单,因为MOSSQL给了你好几种不同的“表”来看时间,每块“表”显示的时间还不完全一样,最常用、最直接的一块“表”就是GETDATE()函数,你只要在查询里写上SELECT GETDATE();,它就会把数据库服务器当前的日期和时间一起给你,精确到小数点后三位,大概是毫秒级别,比如返回2023-10-27 15:30:45.123这样的格式,这个函数几乎是你处理时间相关操作的基础,大部分时候用它准没错。

(来源:微软官方文档 SYSDATETIME 条目) 但如果你对时间精度要求特别高,比如在做性能测试或者需要非常精确的时间戳时,GETDATE()可能就不够用了,这时候你得请出更高级的SYSDATETIME()函数。(来源:微软官方文档 SYSDATETIME 条目)这个函数返回的也是服务器当前日期和时间,但它的精度更高,能到小数点后七位,也就是100纳秒级别,你运行SELECT SYSDATETIME();,可能会得到像2023-10-27 15:30:45.1234567这样的结果,显然,这比GETDATE()要精细得多,不过对于一般的业务场景,比如记录订单创建时间、日志时间,GETDATE()的精度已经绰绰有余了。

(来源:博客园《SQL Server中GETUTCDATE的使用》) 你可能会遇到跨时区的问题,比如你的数据库服务器放在美国,但用户遍布全球,如果大家都用服务器本地时间记录,那就全乱套了,为了解决这个问题,MSSQL提供了GETUTCDATE()函数。(来源:博客园《SQL Server中GETUTCDATE的使用》)UTC时间就是协调世界时,可以理解为全球的一个标准时间,没有时区之分,你执行SELECT GETUTCDATE();,得到的就是当前的UTC时间,如果你的服务器在中国(东八区),那么这个时间会比用GETDATE()得到的时间慢8个小时,把所有时间都统一存成UTC时间,是处理跨时区应用时一个非常好的习惯,等到前端显示的时候,再根据用户所在的时区转换成本地时间。

MSSQL里怎么搞时间那点事儿,教你几招拿到服务器时间

(来源:个人技术笔记《SQL Server日期时间函数区别》) 上面说的这几个函数,返回的都是一个完整的时间点,包含年月日时分秒,但有时候我们并不需要这么详细的信息,你只想知道今天几号,而不关心具体是几点几分,MSSQL也考虑到了这种需求,提供了CURRENT_TIMESTAMP这个关键字。(来源:个人技术笔记《SQL Server日期时间函数区别》)它的效果和GETDATE()是一样的,但它是ANSI SQL标准的一部分,而GETDATE()是MSSQL特有的,如果你写的SQL语句需要考虑在不同数据库(比如Oracle、MySQL)之间的兼容性,用CURRENT_TIMESTAMP可能会更好一些,你可以这样用:SELECT CURRENT_TIMESTAMP;

(来源:Stack Overflow 问答 “What is the difference between GETDATE() and SYSDATETIME()?”) 那如果我只想要日期部分,不想要时间部分呢?这在做按天统计的时候特别有用,在比较老的MSSQL版本(比如2008之前)里,可能需要用CONVERT函数把GETDATE()的结果转成只显示日期的格式,但从SQL Server 2008开始,引入了一个更简单的专门用于处理日期的函数CURENT_DATE。(来源:Stack Overflow 问答 “What is the difference between GETDATE() and SYSDATETIME()?”)你运行SELECT CURRENT_DATE;或者SELECT CAST(GETDATE() AS DATE);,得到的结果就是像2023-10-27这样的纯日期,时间部分会被截断掉,变成零点,同样地,如果你只想要当前的时间,不管日期,可以用SELECT CURRENT_TIME;或者SELECT CAST(GETDATE() AS TIME);,它会返回像15:30:45.1234567这样的纯时间。

MSSQL里怎么搞时间那点事儿,教你几招拿到服务器时间

(来源:IT社区教程《SQL Server获取时间戳》) 除了这些“现成”的时间,有时候我们还需要一种叫做“时间戳”的东西,这里要注意,MSSQL里的TIMESTAMP和我们通常理解的时间戳不太一样。(来源:IT社区教程《SQL Server获取时间戳》)它并不是一个表示时间的日期时间类型,而是一个二进制数字,通常用于表示数据行的版本,保证数据的唯一性,如果你想要像其他编程语言里那种表示从1970年1月1日到现在经过的秒数或毫秒数的时间戳,在MSSQL里需要稍微计算一下,一个常见的方法是使用DATEDIFF函数,要获取当前时间的毫秒级时间戳,你可以这样写:SELECT DATEDIFF_BIG(MS, '1970-01-01', GETUTCDATE());,这个计算返回的就是一个很大的数字,这就是标准的时间戳。

(来源:知乎专栏《细说SQL Server中的时间处理》) 再提一个不太常用但关键时刻很有用的函数SYSDATETIMEOFFSET()。(来源:知乎专栏《细说SQL Server中的时间处理》)这个函数比SYSDATETIME()更强大,它除了返回高精度的日期时间外,还会带上服务器所在时区的偏移量信息,比如你执行SELECT SYSDATETIMEOFFSET();,可能会得到2023-10-27 15:30:45.1234567 +08:00这样的结果,最后的+08:00就表示当前时区比UTC时间快8小时,这对于需要同时知道本地时间和时区信息的应用场景非常方便。

在MSSQL里获取服务器时间,你可以根据你的实际需要,像选工具一样从这些函数里挑一个最合适的,要简单通用就用GETDATE(),要高精度就用SYSDATETIME(),要处理时区就用GETUTCDATE(),只要日期或时间的一部分就用CAST(... AS DATE/TIME),把这些招数记下来,以后碰到时间那点事儿,基本上就都能应付了。