SQL Server 中 关于时间 类型的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 中 关于时间 类型的区别相关的知识,希望对你有一定的参考价值。

date datetime datetime2(7) datetimeoffset(7) time timestamp

1、首先获取当前系统数据库的日期和时间,可以利用函数GETDATE(),select GETDATE();如下图所示。

2、获取当前世界标准时间的日期时间值,利用GETUTCDATE()函数,select GETUTCDATE();如下图所示。

3、然后select DATEADD(DAY,1,'2015-5-11');在指定的时间增加一天。

4、在指定的时间增加两年,select DATEADD(YEAR,2,'2015-03-17')。

5、最后datediff函数计算两个时间相差值,第一个参数是按照单位计算差值,分,小时,秒,天,月,年,都可以。

参考技术A 直接从每个类型定义就可以看出区别:
date、time、datetime三个类型直接从意思上可以理解,date是日期,time是时间,datetime是日期跟时间。“()”里面的数字是表示长度。

datetime2数据类型,类似于之前的datetime类型,不过其精度比较高,可以精确到小数点后面7位(100ns);

datetimeoffset数据类型,加入了时区偏移量部分,时区偏移量表示为 [+|-] HH:MM。 HH 是范围从 00 到 14 的 2 位数,表示时区偏移量的小时数。 MM 是范围从 00 到 59 的 2 位数,表示时区偏移量的附加分钟数。 时间格式支持到最小 100 毫微秒。 必需的 + 或 - 符号指示在 UTC(通用协调时间或格林尼治标准时间)中是加上还是减去时区偏移量以获取本地时间。使用示例:

'2008-08-08 08:08:08.0 +8:00'

timestamp
timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。本回答被提问者采纳
参考技术B

以SQLServer2008为例


日期时间类型

date:日期

time:时间

datetime:时间+日期,有效时间范围1753/1/1~9999/12/31,精确到3.33ms。

datetime2[(n)]:是精度可以改变的时间+日期,当然是指改变时间的精度啦

smalldatetime:结果类似于datetime,但是还是有区别的,smalldatetime的有效时间范围1900/1/1~2079/6/6,精确到分钟。

datetimeoffset

DATE
2017-09-19

TIME
09:05:09.2670000

DATETIME
9 19 2017  9:05AM

DATETIME2可以设置精度
DATETIME2
2017-09-19 09:05:09.2670000

DATETIME2(5)
2017-09-19 09:05:09.26700

SMALLDATETIME
9  19 2017  9:05AM

DATETIMEOFFSET
2017-09-19 09:05:09.2670000 +00:00

输出上面的源码

DECLARE @dt AS DATE 
SET @dt=GETDATE() 
PRINT 'DATE'; 
PRINT @dt; 
/*2017-09-19*/ 

DECLARE @dt2 AS TIME 
SET @dt2=GETDATE() 
PRINT 'TIME'; 
PRINT @dt2; 
/*08:49:53.7830000*/ 

DECLARE @dt3 AS DATETIME 
SET @dt3=GETDATE() 
PRINT 'DATETIME'; 
PRINT @dt3; 
/*9  19 2017  8:50AM*/ 

PRINT 'DATETIME2可以设置精度'; 
DECLARE @dt4 AS DATETIME2 
SET @dt4=GETDATE() 
PRINT 'DATETIME2'; 
PRINT @dt4; 
/*2017-09-19 09:16:03.6300000*/ 

DECLARE @dt5 AS DATETIME2(5) 
SET @dt5=GETDATE() 
PRINT 'DATETIME2(5)'; 
PRINT @dt5; 
/*2017-09-19 08:53:03.63000*/ 

DECLARE @dt7 AS SMALLDATETIME 
SET @dt7=GETDATE() 
PRINT 'SMALLDATETIME'; 
PRINT @dt7; 
/*9  19 2017  8:55AM*/ 

DECLARE @dt8 AS DATETIMEOFFSET 
SET @dt8=GETDATE() 
PRINT 'DATETIMEOFFSET'; 
PRINT @dt8; 
/*2017-09-19 08:55:54.5770000 +00:00*/

SQL SERVER中强制类型转换cast和convert的区别

参考技术A 几乎一样,但是convert比cast多了个style
可以让转换结果变成指定的显示样式
以下是网上找到的参考资料
sql中的cast
和convert都是用来将一种数据类型的表达式转换为另一种数据类型的表达式。cast

convert
提供相似的功能,只是语法不同。在时间转化中一般用到convert,因为它比cast多加了一个style,可以转化成不同时间的格式。
一、语法:
1、使用
cast
  cast
(
expression
as
data_type
)
2、使用
convert
  convert
(data_type[(length)],
expression
[,
style])
3、参数说明
  expression
  是任何有效的表达式。
  data_type:
  目标系统所提供的数据类型,包括
bigint

sql_variant。不能使用用户定义的数据类型。
  length
  nchar、nvarchar、char、varchar、binary

varbinary
数据类型的可选参数。
  style
  日期格式样式,借以将
datetime

smalldatetime
数据转换为字符数据(nchar、nvarchar、char、varchar、nchar

nvarchar
数据类型);或者字符串格式样式,借以将
float、real、money

smallmoney
数据转换为字符数据(nchar、nvarchar、char、varchar、nchar

nvarchar
数据类型)。
二、cast和convert的代码示例
sql
代码
复制
select
cast('123'
as
int)
--
123
select
convert(int,
'123')
--
123
select
cast(123.4
as
int)
--
123
select
convert(int,
123.4)
--
123
select
cast('123.4'
as
int)
select
convert(int,
'123.4')
--
conversion
failed
when
converting
the
varchar
value
'123.4'
to
data
type
int.
select
cast('123.4'
as
decimal)
--
123
select
convert(decimal,
'123.4')
--
123
select
cast('123.4'
as
decimal(9,2))
--
123.40
select
convert(decimal(9,2),
'123.4')
--
123.40
declare
@num
money
set
@num
=
1234.56
select
convert(varchar(20),
@num,
0)
--
1234.56
select
convert(varchar(20),
@num,
1)
--
1,234.56
select
convert(varchar(20),
@num,
2)
--
1234.5600
三、convert函数的style参数说明
1、date

time
样式
不带世纪数位
(yy)
带世纪数位
(yyyy)
输入/输出
-
0

100
mon
dd
yyyy
hh:miam(或
pm)
1
101
1
=
mm/dd/yy
101
=
mm/dd/yyyy
2
102
2
=
yy.mm.dd
102
=
yyyy.mm.dd
3
103
3
=
dd/mm/yy
103
=
dd/mm/yyyy
4
104
4
=
dd.mm.yy
104
=
dd.mm.yyyy
5
105
5
=
dd-mm-yy
105
=
dd-mm-yyyy
6
106
6
=
dd
mon
yy
106
=
dd
mon
yyyy
7
107
7
=
mon
dd,
yy
107
=
mon
dd,
yyyy
8
108
hh:mi:ss
-
9

109
mon
dd
yyyy
hh:mi:ss:mmmam(或
pm)
10
110
10
=
mm-dd-yy
110
=
mm-dd-yyyy
11
111
11
=
yy/mm/dd
111
=
yyyy/mm/dd
12
112
12
=
yymmdd
112
=
yyyymmdd
-
13

113
dd
mon
yyyy
hh:mi:ss:mmm(24h)
14
114
dd
mon
yyyy
hh:mi:ss:mmm(24h)
-
20

120
yyyy-mm-dd
hh:mi:ss(24h)
-
21

121
yyyy-mm-dd
hh:mi:ss.mmm(24h)
-
126
yyyy-mm-ddthh:mi:ss.mmm(无空格)
-
127
yyyy-mm-ddthh:mi:ss.mmmz(无空格)
-
130
dd
mon
yyyy
hh:mi:ss:mmmam
-
131
dd/mm/yyyy
hh:mi:ss:mmmam
2、float

real
样式

输出
0(默认值)
最多包含
6
位。
根据需要使用科学记数法。
1
始终为
8
位值。
始终使用科学记数法。
2
始终为
16
位值。
始终使用科学记数法。
3、money

smallmoney
样式

输出
0
小数点左侧每三位数字之间不以逗号分隔,小数点右侧取两位数,例如
4235.98。
1
小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如
3,510.92。
2
小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如
3,510.92。
126
转换为
char(n)

varchar(n)
时,等同于样式
2

以上是关于SQL Server 中 关于时间 类型的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 中 关于@和declare的解释,请看详细

SQL Server:关于用户定义的表类型的 ltrim

关于SQL Server中修改“用户自定义表类型”的问题

关于sqlserver的时间输出与类型转化问题问题

关于sql server 的那些事

SQL Server常用数据类型