SQL Server 对日期的操作函数的使用

在编写sql的时候,会碰到对日期的处理,特别是日期区间对业务数据的限制。
如:用户数据的是一个固定月份 2020-03 这个时候需要匹配数据就是2020-03-01 ~ 2020-03-31的数据。对于此类处理,就需要编写sql的人员进行运算转化出两个日期去限制数据区间了。

网上搜了一些处理方式,大部分都是拼接而成,在各种比较下,如下的处理方式比较合理与准确。

--当前日期
select getdate() CurrentDate;
--当月第一天
select dateadd(day,-day(getdate())+1,getdate()) current_Month_FirstDay;
--当月最后一天
select dateadd(month,datediff(month,0,dateadd(month,1,getdate())),-1) current_Month_EndDay;--当年第一天
select dateadd(YEAR,datediff(YEAR,0,getdate()),0) current_Year_FirstDay;
--当年最后天
select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,1,getdate())),-1) current_Year_EndDay;
--下年第一天
select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,1,getdate())),0) next_Year_Firstday;
--下年最后一天
select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,2,getdate())),-1) next_Year_Endday;
--上年第一天
select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,-1,getdate())),0) last_Year_Firstday;
--上年最后一天
select dateadd(YEAR,datediff(YEAR,0,getdate()),-1) last_Year_Endday;

解释:

0
表示1990-01-01,
datediff(YEAR,0,getdate())
表示1990到当前日期是多少年
dateadd(YEAR,datediff(YEAR,0,getdate()),0)
表示从1990年加datediff(YEAR,0,getdate()) 年,刚好就是当前日期所在年度的一月一号

其他的几种表示方式,以此思路类推,包括month,day等关键词

介绍两个重要的函数(DATEDIFF 、DATEADD)

  1. DATEDIFF (Transact-SQL)
    此函数返回指定的 startdate 和 enddate 之间所跨的指定 datepart 边界的计数(作为带符号整数值) 。
语法
DATEDIFF ( datepart , startdate , enddate )

参数
datepart
DATEDIFF 用于报告 startdate 与 enddate 之间差异的单位。 常用 datepart 单位包括 month 或 second。

datepart 值不能在变量中指定,也不能指定为带引号的字符串,如 ‘month’。

下表列出了所有有效的 datepart 值 。 DATEDIFF 接受 datepart 的全名或任何列出的全名缩写形式。


startdate
可解析为下列值之一的表达式:
•date
•datetime
•datetimeoffset
•datetime2
•smalldatetime
•time

enddate
请参阅 startdate 。

返回类型
int

返回值

startdate 与 enddate 之间的 int 差异,以 datepart 设置的边界表示 。

例如,SELECT DATEDIFF(day, ‘2036-03-01’, ‘2036-02-28’); 返回 -2,提示 2036 必须为闰年。 这种情况意味着如果从 startdate ‘2036-03-01’ 开始,然后计数 -2 天,则会得到 enddate ‘2036-02-28’。

若 bigint 的返回值超出范围(-2,147,483,648 到 +2,147,483,647),DATEDIFF 返回错误 。 对于 millisecond,startdate 和 enddate 之间的最大差值为 24 天 20 小时 31 分钟 23.647 秒 。 对于 second,最大差值为 68 年 19 天 3 小时 14 分 7 秒 。

如果为 startdate 和 enddate 都只指定了时间值,并且 datepart 不是时间 datepart,则 DATEDIFF 返回 0 。

DATEDIFF 使用 startdate 或 enddate 的时区偏移部分来计算返回值。

由于 smalldatetime 仅精确到分钟,因此在 startdate 或 enddate 具有 smalldatetime 值时,返回值中的秒和毫秒将始终设置为 0 。

如果只为某个日期数据类型变量指定时间值,DATEDIFF 会将所缺日期部分的值设置为默认值:1900-01-01。 如果只为某个时间或日期数据类型的变量指定日期值,DATEDIFF 会将所缺时间部分的值设置为默认值:00:00:00。 如果 startdate 和 enddate 中有一个只含时间部分,另一个只含日期部分,DATEDIFF 会将所缺时间和日期部分设置为各自的默认值 。

如果 startdate 和 enddate 具有不同的日期数据类型,并且其中一个的时间部分或秒小数部分精度比另一个高,DATEDIFF 会将另一个的所缺部分设置为 0 。

示例

SELECT DATEDIFF(day, '2020-01-01', '2020-02-01');
结果:31
说明2020-01-01到2020-02-01 是31天SELECT DATEDIFF(YEAR, 0, '2020-01-01');
结果:120
这个说明是1900到2020是120年SELECT DATEDIFF(MONTH, 0, '2020-01-01');
结果:1440
这个说明是1900到2020是1440个月其他类型以此类推
  1. DATEADD (Transact-SQL)
语法
DATEADD (datepart , number , date )

参数
datepart
DATEADD 要将其与整数值相加的 date 的一部分 。 此表列出了所有有效的 datepart 参数 。

number
一个表达式,可解析为 DATEADD 将其与 date 的 datepart 相加的 int 。 对于 number,DATEADD 接受 用户定义的变量值 。 DATEADD 将截断带小数部分的指定 number 值 。 在这种情况下,它不对 number 值进行舍入 。

date
可解析为下列值之一的表达式:
•date
•datetime
•datetimeoffset
•datetime2
•smalldatetime
•time

返回类型

此方法的返回值数据类型是动态的。 返回类型取决于为 date 提供的参数。 如果 date 的值是字符串文本日期,则 DATEADD 返回日期/时间值 。 如果为 date 提供了其他的有效输入数据类型,则 DATEADD 返回相同的数据类型。 如果字符串文本秒数小数位超过三位 (.nnn) 或如果字符串文本包含时区偏移量部分,则 DATEADD 引发错误。

示例

SELECT DATEADD(month, 1, '2020-08-30');
结果:2020-09-30 00:00:00
说明 2020-08-30加了一个月SELECT DATEADD(year, 1, '2020-02-03');
结果:2021-02-03 00:00:00
说明2020-02-03加了一年

SQL Server获取当年第一天当年最后一天当月第一天当月最后一天相关推荐

  1. Sql Server获取数据库名,表信息,字段信息,主键信息等

    --Sql Server获取数据库名,表信息,字段信息,主键信息等--获取所有数据库名: SELECT name FROM master..sysdatabases WHERE name NOT IN ...

  2. sql server 获取本机的ip地址

    --sql server 获取本机的ip地址 -- 其实就是使用xp_cmdshell 来获取信息,然后对信息进行筛选. --开启xp_cmdshell exec sp_configure 'show ...

  3. 使用SQL Server 获取插入记录后的ID(自动编号)

    使用SQL Server 获取插入记录后的ID(自动编号) jingxian 本篇文章是对使用SQL Server获取插入记录后的ID(自动编号)的方法进行了详细的分析介绍,需要的朋友参考下 最近在开 ...

  4. 使用SQL Server 获取插入记录后的自增ID(自动编号)

    http://www.jb51.net/article/39029.htm 本篇文章是对使用SQL Server获取插入记录后的ID(自动编号)的方法进行了详细的分析介绍,需要的朋友参考下 最近在开发 ...

  5. sql server 获取当前日期前12个月的月份sql 语句

    sql server 获取当前日期前12个月的月份sql 语句 select convert(varchar(7),dateadd(mm,number,dateadd(month,-11,getdat ...

  6. SQL server获取数据库数据

    SQL server获取数据库数据 两表对比,查询A表中缺少的字段 例如 获取数据库指定表中的列 例如 获取某个存储过程的参数 两表对比,查询A表中缺少的字段 select a.name as nam ...

  7. Java获取当年以及任意一年的第一天和最后一天 获取当天的开始时间和结束时间 自动获取去年的年份 常用于每年的数据统计

    @Slf4j public class DateTimeUtil {/*** 默认日期格式*/public static String DEFAULT_FORMAT = "yyyy-MM-d ...

  8. php sql查看本月记录,SQL Server 获取本周,本月,本年等时间内记录

    datediff(week,zy_time,getdate())=0 //查询本周 datediff(month,zy_time,getdate())=0 //查询本月 本季:select * fro ...

  9. sql server 获取上个月,上周

    上周第一天:SELECTDATEADD(wk, DATEDIFF(wk,0,getdate()-7), 0) 上周最后一天:SELECTDATEADD(wk, DATEDIFF(wk,0,getdat ...

最新文章

  1. 【全网唯一】全网唯一能够跑通的,跑不通你来找我~用node.js完成微信支付下单功能,且只需要一个文件wxpay.js就解决业务流程的node.js程序
  2. 容器必须设置宽度吗_消防泵必须设置自动巡检柜吗
  3. 2021年AI将改变制造业的6大应用趋势
  4. perl xml dom中文乱码问题解决
  5. 用户和组相关的配置文件总结
  6. matlab画孔斯曲面,CAD CAM技术基础:第五讲 孔斯曲面
  7. PHP代码20个实用技巧(转)
  8. vue-cli起服务chrome不能打断点——每周汇总(第一周)
  9. 题解【luogu P2421 bzoj P1407 [NOI2002]荒岛野人】
  10. 一般算术表达式转换成后缀式
  11. 资料管理工具VSGoogle?
  12. 适配器模式之门面模式
  13. Linux下类FreeBSD uprintf实现
  14. python无人驾驶技术_智能汽车无人驾驶资料调研(一)
  15. 三、Multisim放置门电路
  16. 期刊论文格式是什么样的,如何排版?
  17. 多台网络分析仪自动化测试软件NSAT-1000
  18. MySQL基础(二)
  19. 奇迹MU虚拟机 游戏多开无法登陆和登录错误的问题如何解决?
  20. 重庆大学计算机在职研究生,重庆大学在职研究生招生学院_重庆大学在职研究生_学校查找_在职研究生教育信息网...

热门文章

  1. 网站有上传后门木马的漏洞怎么解决
  2. 【文件上传漏洞11】中间件文件解析漏洞基础知识及实验——Nginx
  3. 编写python程序、计算账户余额_《易学Python》——第1章 为何学习Python 1.1 学习编程...
  4. 反差检测自动对焦(CDAF)与相位检测自动对焦(PDAF)原理
  5. java if 跳出循环_break跳出的是if语句,还是for循环?
  6. 从零开始水安卓——APP内容共享
  7. 快传号视频批量上传,禁止转载!
  8. 恒辉信达全数据AI管控云平台动态运维管控
  9. VS_设置护眼背景色
  10. 2018年第九届蓝桥杯省赛C/C++ A组(蒻鸡自己写的,看不上勿喷,自己的一点想法)