SQL 常用时间处理
本文适用于SQL Server数据库的T-SQL语法,我只是个搬运工,进行简单归类,微软官网国内可以直接访问,我就不截图和专门整理了,想看详情,直接点击函数
获取当前时间: GetDate()
日期转换:
Convert(varchar(20),GetDate(),120) --其中20可以替换成自己想要的长度,进行一定程度的截取,其中的120可以根据需要替换成需要的StyleID
官网StyleID代表意义的对应地址:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15#BKMK_examples 【Examples的第J个例子】
萌新注意:datetime类型在没有必要的情况下,不要胡乱转换,比如,2020-11-26 16:41:56代表和20/11/26 16:41:56,如果是datetime类型的话,表示的是datetime类型的同一个值,可以直接进行简单运算,但如果多此一举转换成varchar之后再进行转换或运算,就容易死了
日期运算:
dateadd(DD,10,'20201126')
或者dateadd(DD,10,GetDate()) --在当前时间的基础上加10天(DD)
参考官网:https://docs.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql?view=sql-server-ver15
日期差值:
DATEDIFF(day, @startdate, @enddate) --计算两个时间的差,并返回相差的天数(day)
获取日期中的指定部分:
DATEPART(year, @datetime)
年月日就不说了,太过无脑,格外需要说的有两个:
Week,计算@datetime是一年中的第几周,这是很多人用这个函数的主要目的之一,不要傻傻的自己计算,我就干过,也见过有人这干过
WeekDay,计算@datetime所在的天是一周中的第几天,这个往往是用来计算周几了,但格外需要注意的是,周日是一周中的第一天,周六是第七天,别因为平时把周日叫做周末,就习惯性的给自己挖坑
时间戳: 先上结果,再解释
SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE()) --普通时间转时间戳 SELECT DATEAdd(s, 1606383910, '1970-01-01 08:00:00') --时间戳转普通时间 SELECT cast(DATEDIFF(S, '1970-01-01 00:00:00', GETUTCDATE()) as bigint)*1000+DATEPART(ms,GETUTCDATE()) --普通时间转时间戳(毫秒) SELECT DATEAdd(ms,1606384726520-cast(1606384726520/1000 as bigint)*1000,dateadd(S, 1606384726520/1000, '1970-01-01 08:00:00')) --时间戳转普通时间(毫秒)
解释1:UTC时间为世界标准时间,1970-01-01 00:00:00是Unix时间纪元,时间戳是世界标准时间距时间纪元的秒数,而我国位于东八区,使用的是UTC+8:00的时间,所以时间戳转换为我国的普通时间的时候,就需要加上8小时的时区差值。
解释2:毫秒时间戳转换之所以麻烦,其一,是因为datediff与dateadd的返回值是int,而时间戳的秒数*1000变为毫秒时,超过了int的最大值,需要用bigInt;
其二,秒级别的时间戳转换忽略了毫秒的精度,有由于无法直接转换为bigInt,要先转换为秒,这就导致丢失精度,所以,在毫秒级别时,需要专门加上毫秒的值