志铭-2021年10月31日 22:57:15

0. 日期和时间类型

0.0 时间类型

数据类型 时间范围 准确度 推荐格式 示例
DATETIME 1753-01-01到9999-12-31 3.33毫秒 'YYYYMMDD hh:mm:ss.nnn' 2021-10-23 14:35:20.727
SMALLDATETIME 1900-01-01到2079-06-06 1分钟 'YYYYMMDD hh:mm' 2021-10-23 14:41:00
DATE 0001-01-01到9999-12-31 1天 'YYYY-MM-DD' 2021-10-23
TIME 00:00:00:0000000到23:59:59.9999999 100纳秒 'hh:mm:ss:nnnnnnn' 14:44:35.4170000
DATETIME2 0001-01-01 00:00:00:0000000到9999-12-31 23:59:59.9999999 100纳秒 'YYYY-MM-DD hh:mm:ss.nnnnnnn' 2021-10-23 14:46:10.9600000
DATETIMEOFFSET 0001-01-01 00:00:00:0000000到9999-12-31 23:59:59.9999999 100纳秒 'YYYY-MM-DD hh:mm:ss.nnnnnnn [+|-] hh:mm' 2021-10-23 14:48:30.8730000 +00:00
  • [注1] SQL Server2008之前的时间类型只有 DATETIME 和 SMALLDATETIME ,2008之后才出现日期和时间的单独类型
  • [注2] DATETIME2比DATETIME的范围变大了,精确杜也提高了
  • [注3] 推荐格式只是推荐格式,其上任何日期类型,都是即支持“YYYY-MM-DD”也是支持“YYYYMMDD”
  • [注4] DATETIMEOFFSET中的 +/- hh:mm表示的时区差
    • UTC时间:世界协调时间,当今世界的标准时间
    • UTC+时区差=本地时间,时区:东为正,西为负
    • 北京时区是东八区,领先UTC时间8个小时

      简单测试,有一个直观的理解:
DECLARE @dateTime DATETIME = GETDATE();
SELECT @dateTime;
--结果:2021-10-23 11:53:56.420 DECLARE @smallDateTime SMALLDATETIME =GETDATE();
SELECT @smallDateTime
--结果:2021-10-23 11:54:00 DECLARE @date DATE=GETDATE();
SELECT @date
--结果:2021-10-23 DECLARE @time TIME =GETDATE();
SELECT @time
--结果:11:53:56.4200000 DECLARE @dateTime2 DATETIME2 =GETDATE();
SELECT @dateTime2
--结果:2021-10-23 11:53:56.4200000 DECLARE @dateTimeOffset DATETIMEOFFSET =GETDATE();
SELECT @dateTimeOffset
--结果:2021-10-23 11:53:56.4200000 +00:00

1. 转换函数

1.1 CAST

  • 【说明】 将指定的表达式转换为目标数据类型。这里有一个前提就是指定表达式理论上可以转换为你指定的目标类型,负责报错

  • 【语法】 CAST( expressionString AS dataType)

  • 【示例】

    • SELECT CAST('012' AS INT) 返回:12
    • SELECT CAST('1.23' AS INT) 返回:在将 varchar 值 '1.23' 转换成数据类型 int 时失败。

1.2 CONVERT

  • 【说明】 其作用和CAST相同

    • 但是CONVERT可以设置第三个参数来指定转换的样式,所以可以通过该参数将特定的时间字符串转为特定的时间格式
    • CAST是标准SQL,而CONVERT不是标准SQL
  • 【语法】 COVNERT(dataType,expressionString,[style_number])

  • 【示例】

    • SELECT CONVERT(INT, '012')返回:12
    • TODO……

2. 日期操作函数

2.0 GETDATE和GETUTCDATE

  • 【说明】 GETDATE和GETUTDATE两个函数都是用于返回datetime类型的当前日期和时间

    • GETUTDATE()是使用数据库服务器上的时区设置来求UTC时间
  • 【示例】

    SELECT GETDATE()
    --结果:2021-10-23 16:59:59.917
    SELECT GETUTCDATE()
    --结果:2021-10-23 08:59:59.917
    --可以直白的看到当前的北京时间(东八区)比世界协调时间快8个小时

2.1 SYSDATETIME和SYSUTCDATETIME

  • 【说明】返回当前时间。等价于GERDATE和GETUTCDATE,这是在SQL Server2008中新增的,返回的2008中增加的DATETIME2类型的结果

  • 【示例】

    SELECT SYSDATETIME()
    --结果:2021-10-23 17:01:54.9879870
    SELECT SYSUTCDATETIME()
    --结果:2021-10-23 09:01:54.9879870

2.2 DATEADD

  • 【说明】 用于在日期值上加上指定单位指定的间隔

    • 注意间隔值可以是负数,从而实现减去指定单位指定的间隔
  • 【语法】

    DATEADD(datePart,number,date)

    时间间隔 参数
    Year,yyyy,yy
    季度 Quarter,qq,q
    Month,mm,m
    一年内的天 DayOfYear,dy,y
    Day,dd,d
    星期 Week,wk,www
  • 【示例】

    --当前日期加1天
    SELECT DATEADD(Day,1,GETDATE())
    --当前日期减1天
    SELECT DATEADD(Day,-1,GETDATE())

2.3 DATEDIFF

  • 【说明】 按照指定的间隔单位,计算两个日期之间的间隔

  • 【语法】

    DATEDIFF(datePart,startDate,endDate)

    注意:其中的datePart和DATEADD中的间隔单位是一样的

  • 【示例}

    --计算两个日期之间间隔几天
    SELECT DATEDIFF(DAY,'2021-01-01','2021-01-02')--结果:1
    --计算两个日期之间间隔几个月
    SELECT DATEDIFF(MONTH,'2020-01-01','2021-01-02')--结果:12

2.4 DATEPART和DATENAME

  • 【说明】获取日期中的指定部分,如年,月,日

    中文环境中二者不同之处:

    DATEPART返回的是一个整形,

    DATENAME返回的是一个字符串类型(若是英文环境下,比如返回月份,则直接返回月份的名称)

  • 【语法】

    DATEPART(datePart,dateString)

    DATENAME(datePart,dateString)

  • 【示例】

    SELECT DATENAME(MONTH,'2021-01-01')--结果:1(字符串类型)
    
    SELECT DATEPART(MONTH,'2021-01-01')--结果:1(整型)

2.5 YEAR、MONTH和DAY

  • 【说明】 获取指定日期中的中指定的部分,如 年,月,日

    可以认为是DATEPART的简化函数

  • 【语法】

    YEAR(dateString)

    MONTH(dateString)

    DAY(dateString)

  • 【示例】

    SELECT YEAR('20211031')--结果:2021
    SELECT MONTH('20211031')--结果:10
    SELECT DAY('20211031')--结果:31

2.6 ISDATE

  • 【说明】判断指定的字符串是否可以转换为时间格式

  • 【语法】

    ISDATE(dateString)

  • 【示例】

    SELECT ISDATE('20211031')--结果:1
    SELECT ISDATE('20211031 22:46:01:01')--结果:1
    SELECT ISDATE('2021-10-31')--结果:1
    SELECT ISDATE('2021/10/31')--结果:1
    SELECT ISDATE('2021-10-32')--结果:0

3. 综合使用示例

3.1 根据出生日期计算年龄

CREATE TABLE #temptable
(
[Name] VARCHAR(4),
[Brithday] VARCHAR(10)
);
INSERT INTO #temptable
VALUES
('张三', '1994-01-01'),
('李四','1994-12-01');--注:测试日期是2021年10月31日 SELECT Name,
DATEDIFF(YEAR, Brithday, GETDATE()) AS Age,--精确到年
CONVERT(INT,DATEDIFF(DAY,Brithday,GETDATE())/365.25) AS Age--精确到日
FROM #temptable; --结果:执行这段语句的日期是2021年10月31日,故李四还没有到今年的生日,所以是26
--Name Age Age
------ -------- ---------
--张三 27 27
--李四 27 26

3.2 待补充中……

T-SQL——函数——时间操作函数的更多相关文章

  1. mysql时间操作函数和存储过程

    因为业务须要统计一批数据.用到关于mysql的时间操作函数和存储过程,问题已经基本解决.把过程记录下: 1. mysql的语句中不支持直接用循环.循环仅仅能在存储过程中使用. 2. 写为文件时,注意一 ...

  2. MS SQL Server时间常用函数

    SQLServer时间日期函数详解,SQLServer,时间日期, 1.      当前系统日期.时间 select getdate() 2. dateadd      在向指定日期加上一段时间的基础 ...

  3. SQL servcer 时间日期函数、数据类型转换

    1.时间日期函数 2.数据类型转换 3.习题 建立两个表,一个部门表,一个人员表.部门:部门的编号,部门的名称,部门的职责.人员:人员的编号,姓名,年龄,性别,cid所属部门

  4. PL/SQL 日期时间类型函数及运算

    内部存储格式: 世纪.年.月.日.小时.分钟.秒 默认格式是:DD-MON-RR. SYSDATE 返回当前的系统时间. SELECT SYSDATE FROM DUAL: 对日期的数学运算 SELE ...

  5. sql server 时间处理函数 datediff() 和getdate()

    一: DATEDIFF() 定义和用法 DATEDIFF() 函数返回两个日期之间的时间. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 en ...

  6. HIVE 时间操作函数

    转自http://www.oratea.net/?p=944 日期函数UNIX时间戳转日期函数: from_unixtime语法:   from_unixtime(bigint unixtime[,  ...

  7. SQL server 时间日期函数、类型转换

    一.日期与时间函数 二.子查询与分页查询

  8. Hive 时间操作函数(转)

    1.日期函数UNIX时间戳转日期函数: from_unixtime 语法:   from_unixtime(bigint unixtime[, string format]) 返回值: string ...

  9. SQL Server 时间类型转换函数

    cast ( expression as data_type(length))convert ( data_type (length), expression, style) //如果未指定 leng ...

随机推荐

  1. linux性能瓶颈排查--内存+cpu+网络+磁盘+应用瓶颈

    概述 作为运维人员,肯定遇到过以下场景,应用突然卡住了,或者异常退出,cpu占用过高等各种异常情况,一般遇到这些异常情况,该如何去查找具体原因呢? linux和jdk提供了一些命令和工具来查看内存.c ...

  2. java版gRPC实战之五:双向流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. zt:我使用过的Linux命令之ar - 创建静态库.a文件

    我使用过的Linux命令之ar - 创建静态库.a文件 本文链接:http://codingstandards.iteye.com/blog/1142358    (转载请注明出处) 用途说明 创建静 ...

  4. 安卓使用讯飞sdk报错

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.iflytek.cloud.SpeechSy ...

  5. 支付宝openssl_sign(): supplied key param cannot be coerced into a private key in

    先说一下,生成rsa 私钥 公钥的方法,以ubuntu 为例sudo apt-get install openssl # 先装上这个库genrsa -out rsa_private_key.pem 1 ...

  6. 小程序跳转H5及其他页面

    一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息等场景中. ...

  7. Appium 自动化测试改造思路

    流水账脚本 从头到尾编写测试脚本 PO封装 业务行为与操作具体页面元素分离 basepage封装 如封装find方法,目的时增强稳定性 数据驱动封装 将常用的数据改为配置文件 为构建测试平台打基础

  8. 从Gartner与IDC三大行业报告,看国产RPA的市场规模与未来发展

    从Gartner与IDC三大行业报告,看国产RPA的市场规模与未来发展 Gartner与IDC的三份报告,描绘出中国RPA的市场规模与未来宏图 文/王吉伟 近期的国产RPA,可谓捷报频频.三个重量级行 ...

  9. [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍

    本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...

  10. SDOI2015 排序

    SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...