• SQL关于日期的计算合集


    前言

    SQL Server中,时间和日期是常见的数据类型,也是数据处理中重要的一部分。SQL Server提供了许多内置函数,用于处理时间和日期数据类型。这些函数可以帮助我们执行各种常见的任务,例如从日期中提取特定的部分,计算日期之间的差异,以及将日期和时间转换为不同的格式。本文将介绍SQL Server中一些常用的时间和日期函数,以及它们的用法和示例。
    在这里插入图片描述

    一些常用的函数

    GetDate获取当天日期

    select getdate()
    
    • 1

    DateFromParts自定义一个日期

    select datefromparts(2023,2,28)
    
    • 1

    DateFormat转换日期格式

    SELECT DATEFORMAT(YourDateColumn, 'YYYY-MM-DD')  AS FormattedDate FROM YourTable
    
    • 1

    DateAdd函数计算日期偏移后的新日期
    SQL中的DATEADD函数用于在给定的日期上添加指定的时间间隔。它的语法如下:

    DATEADD(datepart, number, date)
    
    • 1

    其中,datepart参数指定要添加的时间间隔类型,例如year(年)、quarter(季度)、month(月)、day(天)、hour(小时)、minute(分钟)或second(秒)。number参数指定要添加的时间间隔数量。date参数是要进行添加操作的日期。

    下面是一些DateDADD函数使用的示例:

    --1. 在当前日期上添加一天:
    
    SELECT DATEADD(day, 1, GETDATE())
    
    --2. 在当前日期上添加一个月:
    
    SELECT DATEADD(month, 1, GETDATE())
    
    --3. 在当前日期上添加一小时:
    
    SELECT DATEADD(hour, 1, GETDATE())
    
    --4. 在指定的日期上添加一周:
    
    SELECT DATEADD(week, 1, '2021-01-01')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这些示例中,DATEADD函数会返回一个新的日期,该日期是在给定的日期上添加了指定的时间间隔后得到的。

    DateDiff函数算时间差
    在SQL中,DATEDIFF函数用于计算两个日期之间的时间间隔。它返回两个日期之间的差值,以指定的时间间隔单位为单位。

    DATEDIFF函数的语法如下:

    DATEDIFF(datepart, startdate, enddate)
    
    • 1

    其中,datepart参数指定要计算的时间间隔类型,例如year(年)、quarter(季度)、month(月)、day(天)、hour(小时)、minute(分钟)或second(秒)。startdate和enddate参数是要计算时间间隔的两个日期。

    下面是一些示例:

    1. 计算两个日期之间的天数差:
    SELECT DATEDIFF(day, '2021-01-01', '2021-02-01')
    
    • 1
    1. 计算两个日期之间的小时差:
    SELECT DATEDIFF(hour, '2021-01-01 10:00:00', '2021-01-01 12:00:00')
    
    • 1
    1. 计算两个日期之间的月数差:
    SELECT DATEDIFF(month, '2021-01-01', '2022-01-01')
    
    • 1

    这些示例中,DATEDIFF函数会返回两个日期之间的差值,以指定的时间间隔单位为单位。

    取日期的周、年、月、日等信息

    DATEPART函数。DATEPART函数返回一个整数,它是日期的一部分,例如日,月和年。

    以下是DATEPART函数的语法:

    select DATEPART ( date_part , input_date ) 
    
    • 1

    DATEPART函数有两个参数:

    date_part是要提取的日期的一部分(参见下表中的有效日期部分)。

    input_date是提取日期部分的日期。
    因此,获取一个日期的WeekNum和WeekDay可以这样

    select DATEPART ( wk ,  getdate() )  as wk
    select DATEPART ( weekday ,  getdate() )  as wkd
    
    • 1
    • 2

    date_part可取值:
    在这里插入图片描述

    在最前面加上以下语句将每周第一天设置为周一

    SET DATEFIRST 1
    --
    select DATEPART ( wk ,  getdate() )  as wk
    
    --
    select DATEPART ( weekday , getdate() )  as wkd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    获取日期所属的当年的ISO标准周周序(ISO 标准周是一种将一年分为 52 或 53 周的时间计算方法,它是国际标准化组织(ISO)制定的一种时间标准。ISO 标准周的起始日期为每年的第一个周四,即该周的第一天为周四,最后一天为周三)

    select DATEPART ( isowk ,  getdate() )  as iso_wk
    
    • 1

    计算本月第一天,上月第一天,去年本月第一天日期

    sql中没有现成的函数实现,我们可以分别计算当前日期的天数d,然后往前移动d天,就可以算出来当前月的第一天的日期了。还一种思路,日期实际上就是数值,我们以0作为基础日期,0表示的日期1970年1月1日1时1分1秒,我们计算当前日期距离基础日期0过去了多少个月,然后在基础日期上移动相应的月份即可。
    有了当前日期月份的第一天,移动一个月就得到了上个月的第一天日期,移动一年就得到了去年当月第一天的日期。

    -- 本月第一天,0作为基础日期1970-01-01 00:00:00
    SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS '本月第一天';
    
    -- 上个月第一天
    SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AS '上个月第一天';
    
    -- 上个月最后一天
    SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) AS '上个月最后一天';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    计算本周第一天,上周第一天以及上周同期

    涉及到周的计算要复杂点,如何计算当前周的第一天,如何计算当前周的前一周的第一天。
    对于第一个问题,我们思考先计算当前日期是周几,比方说周三,那说明周一需要往前推2天,我们先用dateparts计算WeekDay,然后用dateadd往前推就好了。
    有了本周第一天,再推一个week就出来上周第一天的日期,接着加上这周的周几就能推出上周同期的日期。

    DECLARE @Today DATE = GETDATE();
    --设置周一为一周的第一天
    SET DATEFIRST 1
    -- 计算本周第一天
    DECLARE @FirstDayOfWeek DATE = DATEADD(DAY, 1 - DATEPART(WEEKDAY, @Today), @Today);
    
    -- 计算上周第一天
    DECLARE @FirstDayOfLastWeek DATE = DATEADD(WEEK, -1, @FirstDayOfWeek);
    
    -- 输出结果
    SELECT @FirstDayOfWeek AS '本周第一天', @FirstDayOfLastWeek AS '上周第一天';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    JVM从零到一系列:01--JVM概述【初识JVM】
    Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记
    SpringBoot对Filter过滤器中的异常进行全局处理
    R语言入门笔记2.5
    Java小白必会!Intellij IDEA安装、配置及使用详细教程
    MySQL之数据库和表的创建与管理
    高可用负载均衡集群-LVS负载均衡
    系分 - 数学与经济管理
    Fastjson tomcat-dhcp链
    被黑客勒索有解决办法吗?
  • 原文地址:https://blog.csdn.net/qq_33909788/article/details/134000905