志铭-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. Docker 安装 MySQL5.6

    方法一.docker pull mysql查找Docker Hub上的mysql镜像 #docker search mysql 这里我们拉取官方的镜像,标签为5.6 #docker pull mysq ...

  2. C# 中 AppDomain 的一些理解

    C# 中 AppDomain 的一些理解 前言 一直想写一个这样的程序:与其它的程序完全解耦,但可以动态的加载其它程序,并执行其中的特定方法,执行完后可以卸载,完全不影响该程序本身.最近无意间发现了 ...

  3. Java从入门到精通(第5版)上半部分

    1.1java简介 先起了oak 橡树 这个名字,因为商标原因改为爪洼岛谐音的Java 一次编写,到处运行 java如何运行 java程序既是编译型又是解释型 Java版本 Java SE 标准版(开 ...

  4. Matlab使用随记

    Matlab 2020 想要看图像每一点的值大小 工具--->数据提示 想要导出的分辨率提高 导出设置--->渲染--->600dpi Matlab 2017b 程序运行后,画出图, ...

  5. Struts2 S2-061 远程命令执行漏洞复现(CVE-2020-17530)

    0x01 漏洞简介 Struts在某些情况下可能存在OGNL表达式注入漏洞,如果开发人员使用了 %{-} 语法进行强制OGNL解析,某些特殊的TAG属性可能会被双重解析.攻击者可以通过构造恶意的OGN ...

  6. P3980-[NOI2008]志愿者招募【费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P3980 题目大意 \(n\)天,第\(i\)天需要\(A_i\)个志愿者.有\(m\)种志愿者,第\(i\)种从\ ...

  7. CF700E-Cool Slogans【SAM,线段树合并,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/CF700E 题目大意 给出一个字符串\(S\),求一个最大的\(k\)使得存在\(k\)个字符串其中\(s_1\)是 ...

  8. 这是我见过最简单的博客文只有一张图,Python基础10分钟学完

  9. Python:安装opencv出现错误Could not find a version that satisfies the requirement numpy==1.13.3 (from versions: 1.14.5, 1.14.6, 1.15.0rc2, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.16.0rc1, 1.16.0rc2,

    安装opencv的时候,出现numpy的版本不匹配,卸载了不匹配的版本,重新安装却是一点用都没有,后面尝试了一下这里的提示pip更新,居然安装成功了,看来pip的版本过低真是误事啊. 报错是: Cou ...

  10. mysql增删改查——条件查询+模糊查询

    条件查询一般是 = 等于 >大于 <小于 >=大于等于 <=小于等于 <>区间 between and区间 or并且 and或者 in包含 like模糊查询 实例, ...