志铭-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. Oracle列值拼接

    最近在学习的过程中,发现一个挺有意思的函数,它可实现对列值的拼接.下面我们来看看其具体用法. 用法: 对其作用,官方文档的解释如下: For a specified measure, LISTAGG  ...

  2. python函数模块

    python函数模块 学习完本篇,你将会深入掌握 函数相关知识 1.函数定义 2.函数如何调用 3.递归函数以及匿名函数使用 模块相关知识 1.模块如何导入调用 2.函数调用顺序 函数定义 函数代码块 ...

  3. MySql WorkBench通过表生成表关系图

    1.mysql workbench 菜单file=>add model(添加模型) 点击上面的add diagram(添加新的图解),就会在右边多出一个新的图解模型 2,mysql workbe ...

  4. C博客作业00--顺序分支结构

    这个作业属于哪个班级 C语言--网络2011/2012 这个作业的地址 C博客作业00--顺序分支结构 这个作业的目标 初步认识C语法,掌握数据表达.printf.scanf语法及分支结构内容 0.展 ...

  5. Kotlin协程基础

    开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...

  6. git 报错 gitThere is no tracking information for the current branch. Please specify which branch you w

    新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错gitThere is no tracking information for the current ...

  7. CF990G-GCD Counting【dfs】

    正题 题目链接:https://www.luogu.com.cn/problem/CF990G 题目大意 给出一棵有点权的树,对于每个\(k\)求有多条路径的点权\(gcd\)为\(k\) \(1\l ...

  8. Python接口自动化测试概念以及意义

    接口定义: 接口普遍有两种意思,一种是API(Application Program Interface),应用编程接口,它是一组定义.程序及协议的集合,通过API接口实现计算机软件之间的相互通信.而 ...

  9. 使用VUE+原生PHP完成搜索后分页的效果

    html代码: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  10. 实验2:Open vSwitch虚拟交换机实践

    作业链接:实验2:Open vSwitch虚拟交换机实践 一.实验目的 能够对Open vSwitch进行基本操作: 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表: 能 ...