当前位置: 首页 > 编程日记 > 正文

Sql年月日计算方法

通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必须注意以下的问题。大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。你可以通过@@DATEFIRST函数来检查第一天设置。

为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。要了解更多的DATEDIFF和DATEADD函数以及时间间隔可以阅读微软联机帮助。

使用DATEDIFF和DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。你必须从时间间隔这个方面来考虑。比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。

一个月的第一天

第一个例子,我将告诉你如何从当前日期去这个月的最后一天。请注意:这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。

这是计算一个月第一天的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)

当天的半夜

曾经需要通过getdate()函数为了返回时间值截掉时间部分,就会考虑到当前日期是不是在半夜。假如这样,这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

深入DATEDIFF和DATEADD函数计算

你可以明白,通过使用简单的DATEDIFF和DATEADD函数计算,你可以发现很多不同的可能有意义的日期。

目前为止的所有例子只是仅仅计算当前的时间和“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天来替换当前日期使得计算可以获得这个月的第一个星期一。

总结

我希望这些例子可以在你用DATEADD和DATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用DATEADD和DATEDIFF函数计算你程序可能要用到的日期时。

---------------------------------------------------------------
附录,其他日期处理方法

1)去掉时分秒
declare @ datetime
set @ = getdate() --'2003-7-1 10:00:00'
SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)

2)显示星期几
select datename(weekday,getdate())

3)如何取得某个月的天数
declare @m int
set @m=2 --月份
select datediff(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1 as varchar)+'-15')
另外,取得本月天数
select datediff(day,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate()) as varchar)+'-15' ,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate())+1 as varchar)+'-15')
或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

4)判断是否闰年:
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then '平年' else '闰年' end
或者
select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))
when 28 then '平年' else '闰年' end

5)一个季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
select datediff(day,@time,dateadd(mm,3,@time))

相关文章:

读《每天懂一点成功概率学》

概率出现某种结果的数量/出现所有结果的数量 所谓“数学概率”,就是理论上计算出来的概率,例如抛硬币时,只有正面和反面两种结果,因此正面出现的概率就是1/2。 另一方面,我们反复抛硬币,根据实际结果计算出…

AV1时代要来了,超高清视频时代视频编码技术的机遇与挑战

近些年随着视频行业的迅猛发展,尤其像短视频、点播、直播、VR等领域的爆发,人们对于高清、超高清视频体验的追求越来越强烈,流媒体平台如何在提升观众观看体验,同时降低播放成本,利用技术降低带宽消耗的同时又能最大化…

敏捷软件开发(c#版)文摘

第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP 第9章 OCP 第10章 LSP 第11章 DIP 第12章 ISP 第13章 C#程序员UML概观 第三部分 薪水支付案例研究 第四部分 打…

asp.net 2.0 中GridView里设置日期格式

在asp.net 1.0 中的datagrid 中 设置日期字段格式时用 DataFormatString"{0:yyyy-MM-dd}"即可。在gridview 中设置短日期格式 使用<asp:BoundField HeaderText"发表时间" DataField"PostTime" DataFormatString"{0:yyyy-MM-dd}" &g…

springboot初学

首先苦于用ssh、ssm来搭建一个项目&#xff0c;这个基础搭建工作就大概要用半天的功夫才能弄好&#xff0c;想到就头疼&#xff0c;后面听了实验室一位大神的建议&#xff0c;用springboot啊&#xff0c;简单的不止一点点。就顺便学习了下这个神器&#xff0c;果然厉害。 有一次…

Exchange 2013与OWA13集成

好久没发新文章了&#xff0c;因为工作变动的原因&#xff0c;实在抱歉&#xff0c;今天给大家分享先office web app 2013怎么和最新的Exchange 2013进行集成使用吧&#xff0c;这点还是蛮有特色的&#xff0c;因为我们改变以往在OWA中预览Office的效果&#xff0c;我们先看看默…

判断一个string是否可以为数字

方案一&#xff1a;Try...Catch(执行效率不高)/// <summary>/// 名称&#xff1a;IsNumberic/// 功能&#xff1a;判断输入的是否是数字/// 参数&#xff1a;string oText&#xff1a;源文本/// 返回值&#xff1a; bool true:是 false:否/// </summary>/// <…

CSDN湘苗培优|火热报名中

湘苗培优火热报名中CSDN高校俱乐部在这里&#xff0c;你能获得CSDN技术认证与企业导师零距离技术交流参与线下技术沙龙活动求职简历指导参与项目交付并有机会企业内推现在报名即可选择由企业支付学费的订单式培养&#xff0c;或入职后再支付学费等多种付费模式&#xff0c;Z大程…

安装配置Emacs-rails

首先你的机器上肯定要安装emacs啦&#xff0c;此步略过不表。1、从 http://rubyforge.org/projects/emacs-rails 下载最新emacs-rails&#xff0c;解压文件到~/.emacs.d/rails 目录2、根据README&#xff0c;你需要下载三个依赖库&#xff1a;cd ~/.emacs.d/rails wget http://…

实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化

来源 | 早起Python大家好&#xff0c;在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序&#xff0c;很多本文将迎合热点&#xff0c;延续上次的NBA爬虫GUI&#xff0c;探讨如何爬取虎扑NBA官网数据&#xff0c;并且将数据写入Excel中同时自动生成折线图&#xff0c;主要…

删除SQL数据库中事务日志方法

DUMP TRANSACTION [数据库名] WITH NO_LOG BACKUP LOG [数据库名] WITH NO_LOG DBCC SHRINKDATABASE([数据库名])

新浪微博应用 IE下面框架嵌套框架的问题解决

新浪微博应用 IE下面框架嵌套框架的问题分为两种&#xff1a;1、回调的参数有误&#xff1b;2、session丢失&#xff1b;第一个问题&#xff0c;需要亲们仔细研读接口文档&#xff0c;App.AuthDialog.show({client_id : <?php echo $this->getParam(sub_appkey);?>,…

corosync+pacemaker+crm简单配置

# 系统 centos7.2 安装版本都是Yum源node1: 192.168.8.111 node2:192.168.8.112 vip :192.168.8.200nfs :192.168.8.113 # 互信~] ssh-keygen~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys~]# chmod go .ssh/authorized_keys~]# scp -p .ssh/i…

给AI系统做“安全体检”,阿里安全提出自动化AI对抗平台CAA | AAAI 2021

出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;安全人员曾为某车企自动驾驶系统做过一次安全测试&#xff0c;用物理对抗攻击欺骗Autopilot车道检测系统&#xff0c;导致汽车在Autopilot不发出警告的情况下驶入错误车道。假如这是一场真实的攻击&#xf…

linux新建文件权限问题

touch /etc/init.d/httpdchmod 755 /etc/init.d/httpdtouch可以新建一个空文件&#xff0c;可以修改文件的创建时间。比如&#xff1a;编译时看到提示文件的时间为将来的时间&#xff0c;可以使用touch命令来修改。Linux chmod 755和chmod 777 在linux终端先输入ls -al,可以看到…

基于MMSeg算法的中文分词类库

最近在实现基于lucene.net的搜索方案&#xff0c;涉及中文分词&#xff0c;找了很多&#xff0c;最终选择了MMSeg4j&#xff0c;但MMSeg4j只有Java版&#xff0c;在博客园上找到了*王员外*(http://www.cnblogs.com/land/archive/2011/07/19/mmseg4j.html )基于Java版的翻译代码…

关于git bush 中不能复制黏贴的问题

如果你是一个新手的话&#xff0c;在你使用个git的过程中&#xff0c;你会发现git 竟然不能复制黏贴&#xff0c;这简直是完全不能忍受的事&#xff0c;复制黏贴可以大大的节省了我们敲代码的时间&#xff0c;特别是在github中clone别人的仓库到本地&#xff0c;url地址需要一个…

linux系统proc目录进程信息详解

Proc 文件系统是一个实时的&#xff0c;常驻内存的文件系统&#xff0c;它跟踪进程在你机器上的运行情况和你系统的状态。/proc文件系统是常驻虚拟内存并且维持着操作系统的动态数据。大部分的 /proc文件系统信息被实时更新来与当前操作系统的状态一致。/proc文件系统的内容能被…

AI开源评测基准AI-Rank,为开源建立标准

当前&#xff0c;数字经济已经成为经济发展的活力引擎和促进经济结构转型升级的重要动能&#xff0c;深刻改变着人类的生产生活方式。12月11日&#xff0c;2020中关村大数据日暨数字经济融合创新发展论坛在北京举行。本届中关村大数据日以“开源共享 生态赋能”为主题&#xff…

Linux 汇编语言开发指南

Linux 汇编语言开发指南肖文鹏 (xiaowp263.net), 北京理工大学计算机系硕士研究生本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生&#xff0c;主要从事操作系统和分布式计算环境的研究&#xff0c;喜爱Linux和Python。你可以通过 xiaowp263.net与他取得联系。 简介&am…

拦截器与filter的区别

在接触拦截器和filter以来&#xff0c;觉得这两者有太多相似之处&#xff0c;都是运用aop的思想处理事情&#xff0c;但是这两者到底有什么区别倒一直很模糊&#xff0c;今天看书的时候&#xff0c;终于看到自己满意的解答了&#xff0c;赶紧记录下来&#xff1a;1.使用范围不同…

湘苗培优 | 从入门到精通

缘起2020年长沙发出软件再出发号召&#xff0c;同时发布了《长沙市软件和信息技术服务业发展三年(2020-2022 年)行动计划》。当软件产业的生态逐渐建立&#xff0c;企业孵化培育的土壤逐渐肥沃&#xff0c;长沙软件产业焕发出前所未有的活力和生机&#xff0c;一大批软件产业项…

HBase scan setBatch和setCaching的区别

2019独角兽企业重金招聘Python工程师标准>>> HBase的查询实现只提供两种方式&#xff1a; 1、按指定RowKey获取唯一一条记录&#xff0c;get方法&#xff08;org.apache.hadoop.hbase.client.Get&#xff09; 2、按指定的条件获取一批记录&#xff0c;scan方法&…

3行Python代码就能获取海量数据?

一谈起数据分析&#xff0c;首先想到的就是数据&#xff0c;没有数据&#xff0c;谈何分析。毕竟好的菜肴&#xff0c;没有好的原材料&#xff0c;是很难做的&#xff5e;所以本期小F就给大家分享一个获取数据的方法&#xff0c;只需三行代码就能搞定。「GoPUP」&#xff0c;大…

c语言中int和指针和字符所占字节

Linux下 sizeof(int);int 4字节 sizeof(char);字符1字节 char * p"12345"; sizeof(p);指针占4字节

SCCM 2012 SP1系列(七)分发部署exe软件

2、exe软件分发以skydrive为例&#xff0c;打开SCCM控制台&#xff0c;展开应用程序管理&#xff0c;右键“包”选择“创建包”打开创建包和应用程序向导&#xff0c;填写部署包的相关信息&#xff0c;勾选“此包包含源文件”&#xff0c;然后点击“浏览”选择sykdrive文件位置…

关于勒索病毒的防御

关于勒索病毒的防御Windows的445漏洞与139漏洞由来已久&#xff0c;大面积暴发只是迟早的事情。关于防御方法其实也有很多&#xff0c;早就满地都是了。但是快速、大量、不断网的部署防御却不容易。比如使用端口排除、删除文件与打印共享服务、修改注册表、使用防火墙、以及组策…

linux的根文件系统中的proc文件夹详解

什么是proc文件系统 |linux /proc目录介绍&#xff5c;proc中文手册proc文件系统是一个伪文件系统&#xff0c;它只存在内存当中&#xff0c;而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息&#xff0c;…

学习C语言必须知道的理论知识(第一章)

计算机语言:人和计算机都能识别的语言。 程序:就是一组计算机能识别和执行的指令叫做程序。 程序设计:从确定任务到得到结果&#xff0c;写出文档的全过程。 机器指令&#xff1a;计算机能直接识别和接受的二进制代码称为机器指令&#xff08;machine instruction&#xff09; …

赠书 | 实现病人数据自动分析建模,Python能做的比你想象得更多

者 | 李秋键责编 | 晋兆雨头图 | CSDN下载自视觉中国*文末有赠书福利数据表格整理等作为我们工作学习生活中最为繁琐和无趣的任务之一&#xff0c;消耗掉了我们的大多数时间。而今天我们就将利用Python对病人数据进行建模&#xff0c;并自动生成表单&#xff0c;从而节省了我们…