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,要先转换为秒,这就导致丢失精度,所以,在毫秒级别时,需要专门加上毫秒的值

 

posted @ 2020-11-27 10:06  ArvinJing  阅读(130)  评论(0编辑  收藏  举报