SQL语法计算 统计时间日期

来源:互联网 发布:网络主播应聘 编辑:程序博客网 时间:2024/05/21 06:33
前言:
无论程序设计者或系统发开者,大多习惯透过程序语言,来执行资料运算以及日期期间的统计,然而如此一来,不仅会增加系统的负荷,也必须花较长的时间运算,因此无法立即呈现前端资料,此外,若资料量过大,也较容易发生当机的状况,此时,如果能善加利用SQL语法,不仅可降低程序的负荷,亦能快速找到所需要的日期区间或统计差。

本文:
就程序开发而言,不管是系统后端,或是统计报表,往往必须运用各种不同的资料来源,大量的交互运算,不仅设计者必须耗费心思开发,使用者也得花上些许时间来等候资料呈现,而且随著资料量愈大、运算愈趋复杂,当机事件与网页无法回应等情况更是层出不穷。

大部分企业的程序开发,皆采用许多程序计算语言与逻辑,光1个月份的统计设计,可能就有将近千行的程序码,以致日常所需的日期差与前后月份等统计,即占据大半的系统统计资源。以财务人员每个月底的统计报表产出为例,由于所撷取的资料来源广泛,可能是ERP、CRM等资料库,透过不断的演算、转换、查询、统计、四舍五入等过程,就足以让系统运作的负荷,持续维持在高点之上。

有监于此,建议相关程序开发人员可善用资料库的语法,再结合部分程序码,不仅能有效减轻系统的负荷,亦让资料库不只具备储存资料的功能,还可有效分散运算,亦即一部分交由资料库运算,另一部分则由系统程序统计,如此一来,不仅提升系统的执行效能,亦可加快计算时间,一举两得岂不皆大欢喜!

因此,本文将介绍目前较常用日期统计方法,以供读者参考、利用;再者,程序开发者亦可透过SQL管理界面执行查询作业,检视目前统计出来的资料正确与否,亦可加深SQL语法的记忆力。

计算每月的第1天

通常设计者会以当月份的第1天到当天的日期区间,进行差异性统计,或是撷取这段时间内的资料,如果其间的资料量与运算量较多,往往造成运算速度缓慢,因此可先透过SQL语法计算日期,之后再套用到程序码当中,如此不仅可提高程序的执行效能,亦可快速取得计算结果。

举例来说,若要找出当月份第1天,输入:SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0),即可获得所需要的日期。


另外,在SQL语法中,若无添加日期显示特别设定,其产生的结果将包含时/分/秒等单位,即「2007-11-01 00:00:00.000」,系统会自动带出以毫秒为最小单位的时间,虽然呈现的资料相当详尽,不过就某些使用情况而言,却太过累赘,此时可藉由程序的辅助,将该数据修正为「2007-11-01」。

计算哪里天是本周的星期一

此一运算大多用于某一系统执行行事历之际,因此,可能因计算机系统设定年月的不同,而造成系统判断错误,透过以下语法,则可计算出正确的日期。例如:今天为2007/11/04星期日,其语法为:SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0),得到的结果(亦即当周的星期一)应为5日。


设计者必须注意的是,系统会以星期日作为每周的第1天,所以上述所得到的结果为「2007-11-05 00:00:00.000」,而非「2007-10-29 00:00:00.000」。

计算每季的第1天

关于每季的统计,以财务部门执行每季报表与统计时最常用,一般设计是以「写死的方式」进行,使用上较不具弹性,这个部分我们同样可以透过SQL语法来计算:SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0),假设今天日期为2007-11-04,本季第1天则为2007-10-01。


计算上个月的最后1天

SQL Server对于时间的计算,可细算到3毫秒之差,所以我们可趁此减去3毫秒,来实际验证一下。假设今天为2007-11-04 ,欲查询上个月最后1天,可输入:SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)),计算出来的结果显示为「2007-10-31 23:59:59.997」。


若要查询今年最后1天日期为何,输入:SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)),便可得知日期时间为「2007-11-30 23:59:59.997」。


查询本月第1个星期一

若要查询本月第1个星期一的日期,可输入:SELECT DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0),其语法中的wk为星期的表示方式。

如果希望计算结果仅出现日期,无须显示毫秒,甚至希望呈现各种不同的日期型态,可透过下列几种语法获得需要的结果。

去时/分/秒的方法
若要完整呈现时/分/秒,输入:declare @ datetime set @ = getdate() --'2003-7-1 10:00:00' 后按下Enter,再输入SELECT @,即可获得当下时/分/秒的时间。


如果要去除时/分/秒,按下Enter后输入「,DATEADD(day, DATEDIFF(day,0,@), 0)」点执行键,便可呈现2种时间表达方式,一是有时/分/秒,二是无时/分/秒的结果。


查询当天星期或日期
可输入:select datename(weekday,getdate())查询当天为星期几,此外,也可以将weekday改成「dd」,显示当天日期为几号,同理,输入「mm」为显示月份,输入「yyyy」则显示年份。


图说:查询当天为星期几。


图说:查询当天日期为几号。


图说:查询当月。


图说:查询今年。

查询某月总天数
若要查询某月份总天数,可利用语法输入欲查询的月份,甚至可透过参数设定,来衔接SQL语法中的「5」,其输入方式为:declare @m int,接著按下Enter后输入set @m=5 --即可设定月份,然后再按下Enter,输入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))),至于结果是一样的。


图说:查询某月总天数。


图说:查询当月总天数。


图说:利用DAY查询当月总天数。

上述各类日期语法还有很多不同的运用,甚至修改年、月、日,就能得到不同的日期呈现方式,这些都是SQL语法的特点,使用者可透过上述语法,自行修改与测试,只要多加练习,不仅能对语法应用更加熟悉,同时也有助提升系统运算效率。
原创粉丝点击