(原创)SQLServer 如何得到某个月的总天数
- 格式:doc
- 大小:35.00 KB
- 文档页数:2
SQL Server各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必须注意以下的问题。
大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。
第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。
所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。
假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。
你可以通过@@DATEFIRST函数来检查第一天设置。
为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。
DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。
DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。
要了解更多的DATEDI FF和DATEADD函数以及时间间隔可以阅读微软联机帮助。
使用DATEDIFF和DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。
你必须从时间间隔这个方面来考虑。
比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。
理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。
一个月的第一天第一个例子,我将告诉你如何从当前日期去这个月的最后一天。
请注意:这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。
每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。
SQL对数据进⾏按⽉统计或对数据进⾏按星期统计的实例代码 对于所有的需求,当你不知道怎么处理的时候,你就先⽤最简单的⽅法,或者说的明⽩⼀点,⽤最原始的⽅法,先实现业务需求再说。
⼀、对提现队列数据表“ims_checkout_task”进⾏汇总统计,按⽉汇总统计每个⽉的提现总额,提现总次数。
1、SQL操作如下:SELECT id,SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 11 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '0',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 10 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '1',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 9 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '2',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 8 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '3',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 7 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '4',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 6 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '5',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 5 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '6',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 4 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '7',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 3 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '8',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 2 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '9',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '10',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 0 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '11'FROM ims_checkout_task 2、数据库返回如下: 3、关键词:case when//流程控制语句case语法,例如,如果sex字段值为1,则输出男;如果sex值为2,则输出⼥;否则输出其他CASE sexWHEN '1' THEN '男'WHEN '2' THEN '⼥'ELSE '其他' END//所以上⾯的SQL为,如果条件成⽴,则输出提现⾦额money字段,否则输出0. 时间处理//对时间戳格式化成 2018-10FROM_UNIXTIME(addTime,'%Y-%m')//SQL获取当前时间格式 2019-08 ,根据expr值不同,依次获取前⼀个⽉1,前两个⽉2 ···DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 0 MONTH),'%Y-%m')// 函数⽤于以不同的格式显⽰⽇期/时间数据。
sqlserversum函数SQL Server中的SUM函数是用于计算指定列的总和的聚合函数。
它可以用于单个列、多个列或通过一个表达式来计算总和。
以下是关于SQL Server SUM函数的详细介绍。
语法:```sqlSUM(column_name)```参数说明:- column_name:要计算总和的列名或表达式。
注意事项:-SUM函数只适用于数值类型的列或表达式。
对于非数值类型的列,SUM函数将返回错误。
-如果SUM函数应用于包含NULL值的列,则结果将为NULL。
-SUM函数可以与其他聚合函数一起使用,例如GROUPBY和HAVING子句。
示例1:计算单个列的总和假设我们有一个员工表,其中有一个列叫做"salary",我们要计算所有员工薪水的总和。
可以使用以下查询来完成:```sqlSELECT SUM(salary) as total_salaryFROM employees;```以上查询将返回一个名为"total_salary"的列,其中包含所有员工薪水的总和。
示例2:计算多个列的总和如果我们想要计算不同部门的总收入和总支出,可以使用以下查询:```sqlFROM financial_dataGROUP BY department;```以上查询将返回一个结果集,其中包含每个部门的总收入和总支出。
示例3:使用表达式计算总和有时我们需要通过在SUM函数中使用一个表达式来计算总和。
例如,我们有一个产品表,其中包含产品的价格和数量列。
我们想要计算每个产品的总销售额,可以使用以下查询:```sqlSELECT product_name, SUM(price * quantity) as total_salesFROM productsGROUP BY product_name;```以上查询将返回每个产品的总销售额。
总结:SQL Server的SUM函数是一个非常有用的聚合函数,可以用于计算指定列或表达式的总和。
【原创版3篇】编制:_______________审核:_______________审批:_______________编制单位:_______________编制时间:____年___月___日序言以下是本店铺编写的3篇《sql server sum 技巧》,希望可以帮助到有需要的朋友。
下载文档后,可根据实际需要进行调整和使用。
(3篇)《sql server sum 技巧》篇1在 SQL Server 中,SUM 函数是用于计算数值列的总数的。
它可以应用于多个列,以计算每组的总和。
下面是一些 SQL Server 中 SUM 函数的技巧:1. 计算一列的总和要计算一列的总和,可以使用以下语法:```SELECT SUM(columnname) FROM tablename;```其中,columnname 是要计算的总数列的名称,tablename 是包含该列的表的名称。
2. 计算多列的总和要计算多列的总和,可以使用以下语法:```SELECT SUM(columnname1), SUM(columnname2),... FROM tablename;```其中,columnname1、columnname2 等是要计算的总数列的名称,tablename 是包含这些列的表的名称。
3. 计算分组后的总和要计算分组后的总和,可以使用以下语法:```SELECT columnname, SUM(columnname) AS total FROM tablename GROUP BY columnname;其中,columnname 是要计算总和的列的名称,tablename 是包含该列的表的名称。
使用 GROUP BY 子句将数据分组到不同的行中,然后使用 SUM 函数计算每组的总和。
4. 计算自连接查询的总和要计算自连接查询的总和,可以使用以下语法:```SELECT columnname, SUM(columnname) AS total FROM tablename AS t1 JOIN tablename AS t2 ON t1.columnname = t2.columnname GROUP BY columnname; ```其中,columnname 是要计算总和的列的名称,tablename 是包含该列的表的名称。
sqlserver date函数SQL Server中有多个与日期相关的函数,用于处理日期和时间数据类型。
下面是一些常用的SQL Server日期函数的说明:1.CURRENT_TIMESTAMP:返回当前的日期和时间。
2.GETDATE(:返回当前的日期和时间,与CURRENT_TIMESTAMP函数相同。
3. DATEPART(datepart, date):返回指定日期部分的整数值。
例如,DATEPART(YEAR, GETDATE()将返回当前日期的年份。
4. YEAR(date):返回指定日期的年份。
5. MONTH(date):返回指定日期的月份。
6. DAY(date):返回指定日期的天数。
7. DATEADD(datepart, number, date):根据指定日期部分的单位和整数值,向指定日期添加指定的时间间隔。
例如,DATEADD(MONTH, 1, GETDATE()将返回当前日期加上一个月的日期。
8. DATEDIFF(datepart, startdate, enddate):返回两个日期之间的时间间隔。
例如,DATEDIFF(DAY, '2022-01-01', '2022-01-31')将返回31,表示两个日期之间相差31天。
9. CONVERT(data_type, e某pression, style):将一个数据类型转换为另一个数据类型。
例如,CONVERT(VARCHAR(10), GETDATE(, 23)将返回当前日期的格式为'yyyy-mm-dd'的字符串。
10. FORMAT(date, format):将日期格式化为指定的字符串格式。
例如,FORMAT(GETDATE(, 'yyyy-MM-dd')将返回当前日期的格式为'yyyy-MM-dd'的字符串。
11. DATEPART(WEEKDAY, date):返回指定日期的星期几。
SQLServer⽇期加减函数DATEDIFF与DATEADD⽤法分析本⽂实例讲述了SQL Server⽇期加减函数DATEDIFF与DATEADD⽤法。
分享给⼤家供⼤家参考,具体如下:SQL Server ⽇期的加减函数: DATEDIFF DATEADDDATEDIFF: 返回跨两个指定⽇期的⽇期边界数和时间边界数, 语法:DATEDIFF ( datepart , startdate , enddate )⽤ enddate 减去startdate注:datepart 指定应在⽇期的哪⼀部分计算差额的参数,其⽇期相减时,只关注边界值,例:SELECT DATEDIFF(YEAR,'2008-12-31','2009-1-1')返回 1DATEADD : 返回给指定⽇期加上⼀个时间间隔后的新 datetime 值。
语法:DATEADD (datepart , number, date )注: datepart 指定要返回新值的⽇期的组成部分number 使⽤来增加 datepart 的值。
正数表⽰增加,负数表⽰减少,如果是⼩数则忽略⼩数部分,且不做四舍五⼊。
通过 DATEDIFF 和 DATEADD 的⼀些⽇期计算1) ⼀年的第⼀天SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0)注:⾸先DATEDIFF(YEAR,0,GETDATE()) --计算当前年份与 1900年相差的年数,然后通过计算1900-1-1加上相差的年数的⽇期即为当年第⼀天2) ⼀个季的第⼀天SELECT DATEADD(Quarter,DATEDIFF(Quarter,0,GETDATE()),0)注:⾸先DATEDIFF(Quarter,0,GETDATE()) --计算当前⽉份与 1900年相差的季份数,然后通过计算1900-1-1加上相差的季份数的⽇期即为当季第⼀天3) ⼀个⽉的第⼀天SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)注:⾸先DATEDIFF(MONTH,0,GETDATE()) --计算当前⽉份与 1900年相差的⽉份数,然后通过计算1900-1-1加上相差的⽉份数的⽇期即为当⽉第⼀天4) ⼀周的第⼀天SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0)5) 当天的半夜 (00:00:00.000)SELECT DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0)6) 上⽉的最后⼀天SELECT DATEADD(ms,-3,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0))注:⽤本⽉的第⼀天减去3毫秒,即得出上个⽉的最有⼀天.SQL SERVER DATETIME类型的时间精确到3毫秒。
在SQLServer中如何来得到某个月的天数?与一个月的最后一天相对应的号数即代表着这个月所拥有的天数。
所以,只需要知道指定月份的最后一天的日期即可得到指定月份的天数。
具体思路如下:/*获取指定月份的天数:1.将指定日期在月份上增加1,使月份推移到下个月的同一天2.将下个月的同一天往前推移到1号3.使用下个月的1号在天数上减去1,就得到指定月份的最后一天的日期4.将指定日期的最后一天的日期转换成'XXXX-XX-XX'的日期格式5.字符串截取,获得本月最后一天的号数6.将号数转换成INT类型*/我将该方法写入了一个函数,查询结果如下:具体代码级注释如下:GOCREATE FUNCTION GetMonthDays(@Date DA TETIME)RETURNS INTASBEGIN--声明一个变量,该变量用来存储一个月中的天数DECLARE@DayCount INT;--声明一个变量,该变量用来存储一个日期DECLARE@NewDate DA TETIME;--声明一个变量,该变量用来存储一个V ARCHAR类型的日期字符串DECLARE@Var_NewDate V ARCHAR(10);--将目标日期的月份增加,使日期推移到下个月的同一天SET@NewDate=DA TEADD(MM,1,@Date);--获取推移后的日期的年和月SET@Var_NewDate=CONVERT(V ARCHAR(7),@NewDate,120)--得到表示推移后的日期再向前推移至该月份的号SET@Var_NewDate=@Var_NewDate+'-01';--不同的系统对于显示时间的方式不同。
有的系统会将日期显示成"XXXX/XX/XX",--而有的系统会将时间显示成"XXXX-XX-XX".为了避免这两种不同显示日期的方式--影响到对日期的转换,在此,采用统一的日期显示格式:"XXXX-XX-XX"SET@Var_NewDate=REPLACE(@Var_nEWdATE,'/','-');--得到新的日期。
SQLServer⽇期查询SQLServer ⽇期函数⼤全⼀、统计语句1、--统计当前【>当天00点以后的数据】SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111) ORDER BY dateandtime DESC2、--统计本周SELECT * FROM 表 WHERE datediff(week,[dateadd],getdate())=03、--统计本⽉SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=04、统计当前SELECT * FROM 表 WHERE datediff(day,[dateadd],getdate())=0Select * From table with(nolock) Where Convert(varchar(10),[CreateTime],120) = Convert(varchar(10),getDate(),120)⼆、时间函数1、当前系统⽇期、时间select getdate()2、dateadd 在向指定⽇期加上⼀段时间的基础上,返回新的 datetime 值,例如:向⽇期加上2天select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.0003、datediff 返回跨两个指定⽇期的⽇期和时间边界数select datediff(day,'2004-09-01','2004-09-18') --返回:174、datepart 返回代表指定⽇期的指定⽇期部分的整数SELECT DATEPART(month, '2004-10-15') --返回 105、datename 返回代表指定⽇期的指定⽇期部分的字符串SELECT datename(weekday, '2004-10-15') --返回:星期五6、day(), month(),year() --可以与datepart对照⼀下select 当前⽇期=convert(varchar(10),getdate(),120),select 当前时间=convert(varchar(8),getdate(),114),select datename(dw,'2004-10-15')select 本年第多少周=datename(week,'2004-10-15'),select 今天是周⼏=datename(weekday,'2004-10-15')7、求相差天数select datediff(day,'2004-01-01',getdate())8、⼀个⽉第⼀天的SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)9、本周的星期⼀SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)select dateadd(wk,datediff(wk,0,getdate()),6)10、⼀年的第⼀天SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)11、季度的第⼀天SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)12、当天的半夜SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)13、上个⽉的最后⼀天SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))14、去年的最后⼀天SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))15、本⽉的最后⼀天SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))16、本年的最后⼀天SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))17、本⽉的第⼀个星期⼀select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0) 18、查询本周注册⼈数select count(*) from [user]where datediff(week,create_day-1,getdate())=019、上周注册⼈数select count(*) from [user]where datediff(week,create_day-1,getdate())=120、本⽉注册⼈数select count(*) from [user]where datediff(month,create_day,getdate())=021、上⽉注册⼈数select count(*) from [user]where datediff(month,create_day,getdate())=1如果要效率,⽤⼀下⽅式22、查询本周注册⼈数select count(*) from [user]where create_day>=dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112)) and create_day<dateadd(day,9-datepart(weekday,getdate()),convert(varchar,getdate(),112)) 23、上周注册⼈数select count(*) from [user]where create_day>=dateadd(day,-5-datepart(weekday,getdate()),convert(varchar,getdate(),112)) and create_day<dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112)) 24、本⽉注册⼈数select count(*) from [user]where create_day>=dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))and create_day<dateadd(month,1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))) 25、上⽉注册⼈数select count(*) from [user]where create_day>=dateadd(month,-1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))) and create_day<dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))26、本周select count(*) from Userwhere datediff(dd,create_day,getdate()) <= datepart(dw,getdate())27、上周select count(*) from Userwhere datediff(dd,create_day,(getdate() - datepart(dw,getdate()))) <= 728、本⽉select count(*) from Userwhere datepart(mm,create_day) = datepart(mm,getdate())29、上⽉select count(*) from Userwhere datepart(mm,create_day) = datepart(mm,getdate()) - 130、本周注册⼈数select count(*) from [User]where datediff(dd,create_day,getdate()) <= datepart(dw,getdate())31、上周注册⼈数select count(*) from [User]where datediff(dd,create_day,(getdate() - datepart(dw,getdate()))) <= 732、本⽉注册⼈数select count(*) from [User]where datepart(mm,create_day) = datepart(mm,getdate())33、上⽉注册⼈数select count(*) from [User]where datepart(mm,create_day) = datepart(mm,getdate()) - 134、查询今⽇所有SELECT * from feedback WHERE (DATEDIFF(d,fedtime,GETDATE())=0) ORDER BY fedid DESC month(create_day)=month(getdate())本⽉month(create_day)=month(getdate())-1 上⽉今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0昨天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=17天内的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=730天内的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=30本⽉的所有数据:select * from 表名 where DateDiff(mm,datetime类型字段,getdate())=0本年的所有数据:select * from 表名 where DateDiff(yy,datetime类型字段,getdate())=0系统函数:系统函数函数参数/功能getDate ( ) 返回系统⽬前的⽇期与时间DateDiff (interval,date1,date2) 以interval 指定的⽅式,返回date2 与date1两个⽇期之间的差值 date2-date1DateAdd (interval,number,date) 以interval指定的⽅式,加上number之后的⽇期DatePart (interval,date) 返回⽇期date中,interval指定部分所对应的整数值DateName (interval,date) 返回⽇期date中,interval指定部分所对应的字符串名称参数 interval的设定值:值缩写(Sql Server) Access 和 ASP 说明Year Yy yyyy 年 1753 ~ 9999Quarter Qq q 季 1 ~ 4Month Mm m ⽉1 ~ 12Day of year Dy y ⼀年的⽇数,⼀年中的第⼏⽇ 1-366Day Dd d ⽇,1-31Weekday Dw w ⼀周的⽇数,⼀周中的第⼏⽇ 1-7Week Wk ww 周,⼀年中的第⼏周 0 ~ 51Hour Hh h 时0 ~ 23Minute Mi n 分钟0 ~ 59Second Ss s 秒 0 ~ 59Millisecond Ms - 毫秒 0 ~ 999access 和 asp 中⽤date()和now()取得系统⽇期时间;其中DateDiff,DateAdd,DatePart也同是能⽤于Access和asp中,这些函数的⽤法也类似举例:复制代码复制代码1.GetDate() ⽤于sql server :select GetDate()2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')返回值为 514592 秒DateDiff('d','2005-07-20','2005-7-25 22:56:32')返回值为 5 天3.DatePart('w','2005-7-25 22:56:32')返回值为 2 即星期⼀(周⽇为1,周六为7)DatePart('d','2005-7-25 22:56:32')返回值为 25即25号DatePart('y','2005-7-25 22:56:32')返回值为 206即这⼀年中第206天DatePart('yyyy','2005-7-25 22:56:32')返回值为 2005即2005年复制代码复制代码Sql 取当天或当⽉的记录表中的时间格式是这样的:2007-02-02 16:50:08.050, 如果直接和当天的时间⽐较,就总得不到准确数据,但是我们可以把这种格式的时间[格式化]成 2007-02-02,也就是只有年-⽉-⽇,然后把当天的时间也格式化成年-⽉-⽇的格式.这样,思路就出来了!我们格式化⽇期要⽤到 Convert()这个函数,要⽤到3个参数,⾸先来格式化当天的⽇期,Convert(varchar(10),getDate(),120)这样我们就可以把当天的⽇期格式化为: 2007-2-2,然后格式化数据库表中的⽇期Convert(varchar(10),TimeFiled,120),最后我们就可以⽤⼀条Sql语句得到当天的数据了.例如:转⾃⽹络程序代码Select * From VIEW_CountBill Where Convert(varchar(10),[time],120) = Convert(varchar(10),getDate(),120)注意:Convert()函数中的各个参数的意义,第⼀个参数,varchar(10)是⽬标系统所提供的数据类型,包括 bigint 和 sql_variant。
SQL Server各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATE ADD和DA TEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必须注意以下的问题。
大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。
第一天(DATEFIR ST)设定决定了你的系统使用哪一天作为一周的第一天。
所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。
假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。
你可以通过@@DATEFIR ST函数来检查第一天设置。
为了理解这些例子,我们先复习一下DATEDI FF和DAT EADD函数。
DATEDIF F函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。
DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。
要了解更多的D ATEDIFF和DATE ADD函数以及时间间隔可以阅读微软联机帮助。
使用DATED IFF和 DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。
你必须从时间间隔这个方面来考虑。
比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。
理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。
SQLServer 获取当前月份的总天数--查询当前月份的天数--思路当前月份+1,就是下个月,然后用下个月的1号减一,就得到当前月份的最后一天,这样就知道当前月份有多少天了--用到的函数getdate()当前的日期dateadd() 在年月日中进行加减操作year()日期中的年部分month()日期中的月部分datepart()取出日期中的某部分--第一步将当前期日的月部分加一select dateadd(mm,1,getdate())--第二步获取加一后的日期的年和月select 年=year(dateadd(mm,1,getdate())),月=month(dateadd(mm,1,getdate()))--第三步拼接成当前月的下一个月的1号select convert(varchar(4),year(dateadd(mm,1,getdate())))+'-'+convert(varchar(2),month(dateadd(mm,1,getdate())))+'-01' --第四步转成日期类型的select 当前月的下一个月的1号=convert(datetime,convert(varchar(4),year(dateadd(mm,1,getdate())))+'-'+convert(varchar(2),month(dateadd(mm,1,getd ate())))+'-01')--第五步把上面得到的日期减一天得到当前月的最后一天select 当前月的最后一天=dateadd(dd,-1,convert(datetime,convert(varchar(4),year(dateadd(mm,1,getdate())))+'-'+convert(varchar(2),month(date add(mm,1,getdate())))+'-01'))--最后一步拿到天数select 当前月份总天数=datepart(dd,dateadd(dd,-1,convert(datetime,convert(varchar(4),year(dateadd(mm,1,getdate())))+'-'+convert(varchar(2), month(dateadd(mm,1,getdate())))+'-01')))。
在SQLServer中如何来得到某个月的天数?
与一个月的最后一天相对应的号数即代表着这个月所拥有的天数。
所以,只需要知道指定月份的最后一天的日期即可得到指定月份的天数。
具体思路如下:
/*
获取指定月份的天数:
1.将指定日期在月份上增加1,使月份推移到下个月的同一天
2.将下个月的同一天往前推移到1号
3.使用下个月的1号在天数上减去1,就得到指定月份的最后一天的日期
4.将指定日期的最后一天的日期转换成'XXXX-XX-XX'的日期格式
5.字符串截取,获得本月最后一天的号数
6.将号数转换成INT类型
*/
我将该方法写入了一个函数,查询结果如下:
具体代码级注释如下:
GO
CREATE FUNCTION GetMonthDays(@Date DA TETIME)RETURNS INT
AS
BEGIN
--声明一个变量,该变量用来存储一个月中的天数
DECLARE@DayCount INT;
--声明一个变量,该变量用来存储一个日期
DECLARE@NewDate DA TETIME;
--声明一个变量,该变量用来存储一个V ARCHAR类型的日期字符串
DECLARE@Var_NewDate V ARCHAR(10);
--将目标日期的月份增加,使日期推移到下个月的同一天
SET@NewDate=DA TEADD(MM,1,@Date);
--获取推移后的日期的年和月
SET@Var_NewDate=CONVERT(V ARCHAR(7),@NewDate,120)
--得到表示推移后的日期再向前推移至该月份的号
SET@Var_NewDate=@Var_NewDate+'-01';
--不同的系统对于显示时间的方式不同。
有的系统会将日期显示成"XXXX/XX/XX",--而有的系统会将时间显示成"XXXX-XX-XX".为了避免这两种不同显示日期的方式--影响到对日期的转换,在此,采用统一的日期显示格式:"XXXX-XX-XX"
SET@Var_NewDate=REPLACE(@Var_nEWdATE,'/','-');
--得到新的日期。
这个日期表示的是距离目标日期的下一个月号的日期
SET@NewDate=CONVERT(DATETIME,@Var_NewDate);
--间新的日期向前推移一天,得到目标日期的最后一天的日期
SET@NewDate=DA TEADD(D,-1,@NewDate);
--使目标日期的最后一天的日期一统一的日期格式来显示,然后转换成对应的日期字符串
SET@Var_NewDate=CONVERT(V ARCHAR(10),@NewDate,120);
--在一个日期中,最后一天的号数就代表着该月份的总天数
--因此,只需要将表示最后一天的日期中的号数截取出来就行了,然后转换成INT类型--在这里需要注意一点的就是,在SQLServer中的字符串截取与在C#种字符串的截取不同
--在SQLServer中截取的索引是从开始的,而在C#中截取的索引是从开始的
SET@DayCount=CONVERT(INT,SUBSTRING(@Var_NewDate,9,2));
--最后,将得到的天数返回就行了
RETURN@DayCount;
END
GO
开发随心,尽善尽美。
--月之江南。