SQL server Date 数据类型
前言
在图书管理系统的练习中,想到可以通过日期筛选图书
然后又是因为用到了存储过程,所以时间操作必定要在数据库中完成
所以就简单的看了下 SQL server 的 Date 数据类型和相关的内置函数
Date分类
Date 数据类型可以分为一下几种:
| 数据类型 | 描述 | 样式 | 存储 |
|---|---|---|---|
| date | 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 2020-04-15 | 3 bytes |
| time | 仅存储时间。精度为 100 纳秒。 | 13:23:22.5333333 | 3-5 bytes |
| datetime | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日 精度为 3.33 毫秒。 | 2020-04-15 13:24:16.920 | 8 bytes |
| datetime2 | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日 精度为 100 纳秒。( datetime的升级版 ) | 2020-04-15 13:26:07.8100000 | 6-8 bytes |
| smalldatetime | 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日 精度为 1 分钟。 | 2020-04-15 13:27:00 | 4 bytes |
| datetimeoffset | 与 datetime2 相同 外加时区偏移。 | 2020-04-15 13:28:01.3133333 +00:00 | 8-10 bytes |
| timestamp | 存储唯一的数字,每当创建或修改某行时,该数字会更新。 timestamp 基于内部时钟,不对应真实时间。 每个表只能有一个 timestamp 变量。( 时间戳 ) | 0x0000000000000FA0 |
若需要手写日期类型,只需要按照样式的仿写然后用引号括起来即可
如
declare @timeDemo datetime
set @timeDemo = '2020-1-1 12:30:45.123'
select @timeDemo as timeDemo
会得到以下结果
| timeDemo |
|---|
| 2020-01-01 12:30:45.123 |
不过要注意,手写的内容必须合法,不然程序会报错!
Date映射关系
| SQL 数据类型 | .NET Framework 类型 | System.Data.SqlDbType |
|---|---|---|
| date | System.DateTime | Date |
| time | System.TimeSpan | Time |
| datetime | System.DateTime | DateTime |
| datetime2 | System.DateTime | DateTime2 |
| smalldatetime | System.DateTime | DateTime |
| datetimeoffset | System.DateTimeOffset | DateTimeOffset |
内置函数
getdate()
getdate() 函数从 SQL Server 返回当前的时间和日期。
如使用如下语句
select getdate() as timeDemo
会得到以下结果
| timeDemo |
|---|
| 2020-04-15 13:41:33.317 |
datepart()
datepart() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
语法
datepart(datepart,date)
其中,date 参数是合法的日期表达式。datepart 参数可以是下列的值:
| datepart | 缩写 |
|---|---|
| 年 | yy,yyyy |
| 季度 | qq,q |
| 月 | mm,m |
| 年中的日 | dy,y |
| 日 | dd,d |
| 周 | wk,ww |
| 星期 | dw,w |
| 小时 | hh |
| 分钟 | mi,n |
| 秒 | ss,s |
| 毫秒 | ms |
| 微秒 | mcs |
| 纳秒 | ns |
如使用如下语句
select datepart(yyyy,getdate()) as Year,
datepart(mm,getdate()) as Month,
datepart(dd,getdate()) as Day
会得到以下结果
| Year | Month | Day |
|---|---|---|
| 2020 | 4 | 15 |
dateadd()
dateadd() 函数在日期中添加或减去指定的时间间隔。
语法
dateadd(datepart,number,date)
date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
datepart 参数上面已经介绍。
如使用如下语句
select dateadd(yy,1,'2020-1-1') as nextYear
会得到以下结果
| nextYear |
|---|
| 2021-01-01 00:00:00.000 |
datediff()
datediff() 函数返回两个日期之间的时间。
语法
datediff(datepart,number,date)
startdate 和 enddate 参数是合法的日期表达式。
datepart 参数上面已经介绍。
如使用如下语句
select datediff(dd,'2020-01-01','2020-01-02') as timeDiffer
会得到以下结果
| timeDiffer |
|---|
| 1 |
convert()
convert() 函数是把日期转换为新数据类型的通用函数。
convert() 函数可以用不同的格式显示日期/时间数据。
语法
convert(data_type(length),data_to_be_converted,style)
data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。
style可以使用下列值
| style ID | style 格式 |
|---|---|
| 100 或 0 | mon dd yyyy hh:miAM (或者 PM) |
| 101 | mm/dd/yy |
| 102 | yy.mm.dd |
| 103 | dd/mm/yy |
| 104 | dd.mm.yy |
| 105 | dd-mm-yy |
| 106 | dd mon yy |
| 107 | Mon dd, yy |
| 108 | hh:mm:ss |
| 109 或 9 | mon dd yyyy hh:mi:ss:mmmAM(或者 PM) |
| 110 | mm-dd-yy |
| 111 | yy/mm/dd |
| 112 | yymmdd |
| 113 或 13 | dd mon yyyy hh:mm:ss:mmm(24h) |
| 114 | hh:mi:ss:mmm(24h) |
| 120 或 20 | yyyy-mm-dd hh:mi:ss(24h) |
| 121 或 21 | yyyy-mm-dd hh:mi:ss.mmm(24h) |
| 126 | yyyy-mm-ddThh:mm:ss.mmm(没有空格) |
| 130 | dd mon yyyy hh:mi:ss:mmmAM |
| 131 | dd/mm/yy hh:mi:ss:mmmAM |
如使用如下语句
select convert(varchar(20),getdate(),101) as date1,
convert(varchar(20),getdate(),112) as date2,
convert(varchar(30),getdate(),126) as date3
会得到以下结果
| date1 | date2 | date3 |
|---|---|---|
| 04/15/2020 | 20200415 | 2020-04-15T14:31:43.143 |
Date 和 运算符
Date 类型是可以使用 = , > , < , >= 和 <= 等运算符的,时间越晚,数值越大
比如
我们比较两个时间的大小,就可以用 > 运算符
if('2020-01-01'>'2020-01-02')
select 'Yse' as result;
else select 'No' as result;
结果如下
| result |
|---|
| No |
个人博客地址:johnnyzhao.com