您的位置:首页 > 数据库

SqlServer时间类型常用技巧

2016-03-27 23:23 246 查看

本文主要对SqlServer时间类型常用技巧做一个小小的总结,主要在于时间与字符串的转换处理。

一、SqlServer常用的时间类型

1、sqlserver常见的时间类型有DATE、DATETIME、TIME、TIMESTAMP四种,其中TIMESTAMP与前三者有所不同,timestamp 这种数据类型表现自动生成的二进制数,类似于序列,是自动生成的;当你改变含有timestamp字段的数据时,timestamp会自动更新到最新的操作时间,timestamp设计的初衷估计就是问了记录数据库的改变。

2、在进行mysql、oracle、SqlServer、Sybase四个数据库常用时间格式的一些总结(做时间抽取的时间戳):(Sybase没有详细的验证)

使用下面字段格式来验证时间戳抽取
数据库类型字段类型格式精确度
ORACLEdateyyyymmdd
yyyymmddhh24miss
varchar2yyyymmddhh24miss
yyyymmddhh24mi
yyyymmddhh
yyyymmdd
yyyy-mm-dd hh:mi24:ss
yyyy/mm/dd hh:mi24:ss
numberTO_NUMBER(TO_DATE('2005-03-29 12:30:45', 'YYYY-MM-DD HH24:MI:SS')-TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000
SqlServerdate 年月日
datetime 
datetime2(7) 
timestamp不能做时间戳(建表时候最好不要这个字段,因为中间库没有对应的字段类型来匹配)
time(7)不能做时间戳时分秒
varchar(100)CONVERT(varchar(100), GETDATE(), 20) 
CONVERT(varchar(100), GETDATE(), 21) 
CONVERT(varchar(100), GETDATE(), 22) 
CONVERT(varchar(100), GETDATE(), 25) 
CONVERT(varchar(100), GETDATE(), 111)yy/mm/dd
CONVERT(varchar(100), GETDATE(), 112)yymmdd
CONVERT(varchar(100), GETDATE(), 120)yyyy-mm-dd hh:mi:ss(24h)
CONVERT(varchar(100), GETDATE(), 121)yyyy-mm-dd hh:mi:ss.mmm(24h)
CONVERT(varchar(100), GETDATE(), 126)yyyy-mm-ddThh:mm:ss.mmm(没有空格)
bigintselect datediff(mi,'',GETDATE())
select datediff(hh,'',GETDATE())
select datediff(day,'',GETDATE())
MysqlDATE 年月日
DATETIME 
TIME不能做时间戳时分秒
TIMESTAMP 
YEAR 
varchar(100)date_format(now(),'%Y%m%d%H%i%S')
date_format(now(),'%Y/%m/%d %H:%i:%S')
date_format(now(),'%Y年%m月%d日 %H时%i分%S秒')
date_format(now(),'%Y%m%d%H%i')
date_format(now(),'%Y%m%d%H')
date_format(now(),'%Y%m%d')
intunix_timestamp(now())
Sybasedate 年月日
datetime 
smalldatetime 
varchar(20)convert(varchar(20),getdate(),102) -- '2003.11.12'年月日
convert(varchar(20),getdate(),111) --'2003/09/27'
convert(varchar(20),getdate(),112) --'20030927
rtrim(convert(varchar(20),getdate(),102))+' '+(convert(varchar(20),getdate(),108)) -- '2003.11.12 11:03:41'
intconvert(int,convert(varchar(20),getdate(),112)) 年月日
二、时间与字符格式的互相转化(最常用)

1、如下表,包含各种时间的字符串格式(这个表相当有用)

例如:A、时间转换成字符串:你想把当前的时间,转换成‘2006-02-22’这样的格式,你可以这样做:CONVERT(CHAR(10), getdate(), 23)

这里有一个问题,把当前的时间转换成‘2016-02’时,你会发现下表中没有对应的格式,这个时候,你只需要改一下字符串的长度就可以了:CONVERT(CHAR(7), getdate(), 23).

B、字符串转换成时间:类似于上面,CONVERT(datetime,'11/1/2003',101)

Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 0)
102/22/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 1)
206.02.22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 2)
322/02/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 3)
422.02.06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 4)
522-02-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 5)
622 Feb 06CONVERT(CHAR(9), CURRENT_TIMESTAMP, 6)
7Feb 22, 06CONVERT(CHAR(10), CURRENT_TIMESTAMP, 7)
816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 8 )
9Feb 22 2006 4:26:08:020PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 9)
1002-22-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 10)
1106/02/22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 11)
12060222CONVERT(CHAR(6), CURRENT_TIMESTAMP, 12)
1322 Feb 2006 16:26:08:020CONVERT(CHAR(24), CURRENT_TIMESTAMP, 13)
1416:26:08:037CONVERT(CHAR(12), CURRENT_TIMESTAMP, 14)
202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)
212006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 21)
2202/22/06 4:26:08 PMCONVERT(CHAR(20), CURRENT_TIMESTAMP, 22)
232006-02-22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 23)
2416:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 24)
252006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 25)
100Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 100)
10102/22/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 101)
1022006.02.22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
10322/02/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 103)
10422.02.2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 104)
10522-02-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 105)
10622 Feb 2006CONVERT(CHAR(11), CURRENT_TIMESTAMP, 106)
107Feb 22, 2006CONVERT(CHAR(12), CURRENT_TIMESTAMP, 107)
10816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 108)
109Feb 22 2006 4:26:08:067PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 109)
11002-22-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 110)
1112006/02/22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 111)
11220060222CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)
11322 Feb 2006 16:26:08:067CONVERT(CHAR(24), CURRENT_TIMESTAMP, 113)
11416:26:08:067CONVERT(CHAR(12), CURRENT_TIMESTAMP, 114)
1202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 120)
1212006-02-22 16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 121)
1262006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 126)
1272006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 127)
13024 ???? 1427 4:26:08:080PMCONVERT(CHAR(32), CURRENT_TIMESTAMP, 130)
13124/01/1427 4:26:08:080PMCONVERT(CHAR(25), CURRENT_TIMESTAMP, 131)
一、时间格式相关的计算

时间的计算有很多的函数,这里介绍一些我经常用的

1、当前时间减去4天时间:DATEADD(D,-4,GETDATE())

2、时间计算:DATEDIFF(mm,begintime,endtime)

这里mm代表的是月,例如begintime=2016-08,endtime=2016-09,那么DATEDIFF(mm,'2016-08',2016-09')=1

同理,y表示年,h表示小时,等等。

3、字符串类型的时间,只要格式一样,也是可以进行比较的。例如begintime='2016-08',endtime='201609',那么begintime<201609=true

四、一个容易出错的地方

在between...and...这个语句中,上限的时间是不包括小时的。

例如:lasttime='2016-05-25 ' begintime='2016-04-25' endtime='2016-05-25 12:12:12'

那么 lasttime就不在between begintime and endtime 这个区间内(如果endtime='2016-05-25' 就包含 )


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: