志铭-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. 羽夏看Win系统内核——环境搭建

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  2. 手动制作Docker镜像

    手动制作 Docker 镜像 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器(用来用去感觉 Windows 的 Docker 出各种问题,比如使用 ...

  3. PHP中命名空间是怎样的存在?(三)

    这是与命名空间有关的最后一篇.最后还是两个比较简单的内容,是关于命名空间和全局相关的一些类.函数.常量的使用对比.当然,最后我们还会总结一下命名空间的名称解析规则做为这三篇系列文章的结束. 全局空间 ...

  4. C# 将PPT转为OFD/DPT/DPS/ODP/POTX/UOP

    本文分享在C#代码程序中,如何将PPT幻灯片文档转换为多种文件格式,如:OFD.DPT.DPS.ODP.POTX.UOP等.只需在加载PPT幻灯片源文档后,调用ppt.SaveToFile(strin ...

  5. win10系统移动热点使用技巧

    win10系统是自动移动热点功能,在平时测试的时候,有时需要进行手机抓包,需要手机和电脑处于同一网络当中,这时可以开启热点使用. 如何开启移动热点? 直接搜索"移动热点" 但是如果 ...

  6. 完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径。)

    完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径.) 错误原因 读出文件的路径需要有被拷贝的文件名,否则无法解析地址 源代码(用 ...

  7. YbtOJ#662-交通运输【线段树合并,树状数组】

    正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/2 题目大意 给出\(n\)个点的一棵有根树,对于每个\(x\)求,删除点\(x\)后修改某个点 ...

  8. P1912-[NOI2009]诗人小G【四边形不等式,单调队列】

    正题 题目链接:https://www.luogu.com.cn/problem/P1912 题目大意 给出\(n\)个字符串,把这些字符串依次用空格(算一个长度)连接分成若干段,若一段长度为\(x\ ...

  9. 一凡老师亲录视频,Python从零基础到高级进阶带你飞

    如需Q群交流 群:893694563 不定时更新2-3节视频 零基础学生请点击 Python基础入门视频 如果你刚初入测试行业 如果你刚转入到测试行业 如果你想学习Python,学习自动化,搭建自动化 ...

  10. 13万字详细分析JDK中Stream的实现原理

    前提 Stream是JDK1.8中首次引入的,距今已经过去了接近8年时间(JDK1.8正式版是2013年底发布的).Stream的引入一方面极大地简化了某些开发场景,另一方面也可能降低了编码的可读性( ...