志铭-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. Javascript 判断 iframe 中的变量是否为对象

    Javascript 判断 iframe 中的变量是否为对象 前言 公司之前的项目中,为了实现模块化,在 web 后端使用了 iframe 来组织框架和页面.由于当时没有很好地规划,iframe 子页 ...

  2. 解决使用tomcat服务器发布web项目时出现URL中文乱码的问题

    打开Tomcat的安装路径 打开server.xml文件 在修改端口号的一行既是下图中位置添加 URIEncoding="UTF-8" 就能替换在用eclipse或者myeclip ...

  3. vue报错 Uncaught TypeError: Cannot read property of null

    有可能是点击a标签,但是a标签有click事件,未阻止默认事件导致报错,开始都看不出来是什么错误

  4. Mybatis中使用级联查询,一对多的查询

    一.需求描述 自己在开发一个小程序的过程中,需要做的一个查询是稍微比较复杂的查询,根据用户信息去查询用户所对应的宠物信息. 一个用户可能对应多个宠物,所以在用户和宠物信息的对应关系就是一对多的关系. ...

  5. fibnacci数列

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  6. django 对models中上传的文件或图片改名

    def user_directory_path(instance,filename): print instance,filename ext = filename.split('.')[-1] pr ...

  7. [转载]CentOS 下安装LEMP服务(Nginx、MariaDB/MySQL和PHP)

    LEMP 组合包是一款日益流行的网站服务组合软件包,在许多生产环境中的核心网站服务上起着强有力的作用.正如其名称所暗示的, LEMP 包是由 Linux.nginx.MariaDB/MySQL 和 P ...

  8. 在modal中的datetimepicker插件BUG修复

    前言:因为在模态框用到datetimepicker这一日期控件,而选中日期时,会触发模态框的再次打开,导致上面表单选的值会重新加载 解决办法: 用stopPropagation() 方法阻止事件传播, ...

  9. Python3入门系列之-----内置的文件操作模块OS

    前言 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这个时候就需要用到os模块. 使用前 ...

  10. selenium--启动不同的浏览器

    在自动化测试经常用到 Firefox,Chrome,IE 浏览器,Firefox 自带驱动,所以我一直用这个测试.那么同一段代码能不能在同时打开两个浏览器呢?当然是可以,浏览器名称参数化. 重点:Ch ...