找了几个地方:发现关于SQL 的基本使用--sql日期精确推算

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 随笔- 192  文章- 11  评论- 17  Sql 日期推算(日期函数的熟练使用) 以下实例都以星期天作为一周的第一天来建立,可查看@@DATEFIRSTDATEDIFF ( datepart , startdate , enddate ) DATEDIFF函数计算两个日期之间的小时、...

随笔- 192  文章- 11  评论- 17 

Sql 日期推算(日期函数的熟练使用)

以下实例都以星期天作为一周的第一天来建立,可查看@@DATEFIRST
DATEDIFF ( datepart , startdate , enddate )
DATEDIFF
函数计算两个日期之间的小时、天、周、月、年等时间间隔总数
DATEADD ( datepart , number, date )
DATEADD
函数计算一个日期通过给时间间隔加减来获得一个新的日期

重点:你必须从时间间隔这个方面来考虑,比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。
第一个例子,"一个月的第一天",我将告诉你如何从当前日期去这个月的最后一天。请注意:这个例子以及这篇文章中的其他例子都将只使用DATEDIFFDATEADD函数来计算我们想要的日期。每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。 
这是计算一个月第一天的SQL  脚本: 
    SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0)  
我们把这个语句分开来看看它是如何工作的。最核心的函数是getdate(),大部分人都知道这个是返回当前的日期和时间的函数。下一个执行的函数DATEDIFF(mm,0,getdate())是计算当前日期和“1900-01-01  00:00:00.000”这个日期之间的月数。记住:时期和时间变量和毫秒一样是从“1900-01-01  00:00:00.000”开始计算的。这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为“0”。下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以获得这个月的第一天。另外,计算出来的日期的时间部分将会是“00:00:00.000” 

这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用来计算很多不同的日期。下一个例子也是用这个技巧从当前日期来产生不同的日期。

本周的星期一 
    
这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。 
     SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0) 
 
一年的第一天 
    
现在用年(yy)的时间间隔来显示这一年的第一天。 
     SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0) 
 
季度的第一天 
    
假如你要计算这个季度的第一天,这个例子告诉你该如何做。 
     SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0) 
目前为止的所有例子只是仅仅计算当前的时间和“1900-01-01”之间的时间间隔数量,然后把它加到“1900-01-01”的时间间隔上来计算出日期。假定你修改时间间隔的数量,或者使用不同的时间间隔来调用DATEADD函数,或者减去时间间隔而不是增加,那么通过这些小的调整你可以发现和多不同的日期。 
 
    
这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。 
 
上个月的最后一天  
    
这是一个计算上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来获得。有一点要记住,在Sql  Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。  
     SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))  
    
计算出来的日期的时间部分包含了一个Sql  Server可以记录的一天的最后时刻(“23:59:59:997”)的时间。 
 
去年的最后一天  
    
连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去3毫秒。 
     SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)) 
 
本月的最后一天  
    
现在,为了获得本月的最后一天,我需要稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和“1900-01-01”返回的时间间隔上加1。通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。  
     SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0)) 
 
本年的最后一天  
    
你现在应该掌握这个的做法,这是计算本年最后一天脚本  
     SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))
 
本月的第一个星期一  
    
好了,现在是最后一个例子。这里我要计算这个月的第一个星期一。这是计算的脚本。 
     SELECT  DATEADD(wk,  DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())),  0)
    
在这个例子里,我使用了本周的星期一的脚本,并作了一点点修改。修改的部分是把原来脚本中“getdate()”部分替换成计算本月的第6天,在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。 
 
总结 
    
我希望这些例子可以在你用DATEADDDATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用DATEADDDATEDIFF函数计算你程序可能要用到的日期时。 

多个示例:

--a. 本月的第一天
select dateadd(mm, datediff(mm,0,getdate()), 0) AS
本月的第一天
--b.
本月的最后一天
select dateadd(ms,-3,dateadd(mm, datediff(mm,0,getdate())+1, 0)) AS
本月的最后一天
--c.
上个月的最后一天
select dateadd(ms,-3,dateadd(mm, datediff(mm,0,getdate()), 0)) AS
上个月的最后一天
--d.
本周的星期一
select dateadd(wk, datediff(wk,0,getdate()), 0) AS
本周的星期一
--e.
本季度的第一天
select dateadd(qq, datediff(qq,0,getdate()), 0) AS
本季度的第一天
--f.
本季度的最后一天
select DATEADD(ms,-3,dateadd(qq, datediff(qq,0,getdate())+1, 0)) AS
本季度的最后一天
--g.
本月的第一个星期一
select dateadd(wk, datediff(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0) AS
本月的第一个星期一
--h.
本年的第一天
select dateadd(yy, datediff(yy,0,getdate()), 0) AS
本年的第一天
--i.
本年的最后一天
select dateadd(ms,-3,dateadd(yy, datediff(yy,0,getdate())+1, 0)) AS
本年的最后一天
--f.
去年的最后一天
select dateadd(ms,-3,dateadd(yy, datediff(yy,0,getdate()), 0)) AS
去年的最后一天

 

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
SQL BI 数据库
达梦(DM) SQL日期操作及分析函数
讲述DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理
|
SQL Serverless 数据库
|
3月前
|
SQL 开发框架 .NET
sql server日期时间函数
sql server日期时间函数
63 2
|
3月前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
5月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
120 0
|
5月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
693 0
|
6月前
|
SQL 数据处理
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
|
8月前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
271 0
|
8月前
|
SQL 索引
SQL日期函数
SQL日期函数
72 0
|
SQL
SQL技巧:构建一个包含过去30天日期的虚拟表
SQL技巧:构建一个包含过去30天日期的虚拟表
146 0