知识大全 SQL Server 中的时间算法
Posted 知
篇首语:山涧的泉水经过一路曲折,才唱出一支美妙的歌。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SQL Server 中的时间算法相关的知识,希望对你有一定的参考价值。
SQL Server 中的时间算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DECLARE @Date DATETIME
SET @Date=GETDATE()
前一天 给定日期的前一天
SELECT DATEADD(DAY @Date) AS 前一天
后一天 给定日期的后一天
SELECT DATEADD(DAY @Date) AS 后一天
GO
月初 计算给定日期所在月的第一天
这个计算的技巧是先计算当前日期到“ ”的时间间隔数 然后把它加到“ ”上来获得特殊的日期 这个技巧可以用 来计算很多不同的日期
DECLARE @Date DATETIME
SET @Date=GETDATE()
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date) ) AS 所在月的第一天
精简算法 根据SQL Server的时间表示方式可知 可以用 代替
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date) ) AS 所在月的第一天
上面两种算法精确到天 时分秒均为 : :
下面算法课以保留时分秒
思路 用给定日期减去月第一天与给定日期差的天数
SELECT DATEADD(DAY DATEPART(DAY @Date) @Date)
GO
月末 计算给定日期所在月的最后一天
DECLARE @Date DATETIME
SET @Date=GETDATE()
思路 当前月的下一月 号在减 天
SELECT DATEADD(DAY DATEADD(MONTH +DATEDIFF(MONTH @Date) )) AS 所在月的最一天
SELECT DATEADD(MONTH +DATEDIFF(MONTH @Date) ) AS 所在月的最一天
用 代替
SELECT DATEADD(DAY DATEADD(MONTH +DATEDIFF(MONTH @Date) )) AS 所在月的最一天
SELECT DATEADD(MONTH +DATEDIFF(MONTH @Date) ) AS 所在月的最一天
思路 与月初计算思路相同
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date) ) AS 所在月的最一天
精简算法 用 代替
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date) ) AS 所在月的最一天
保留时分秒的算法
SELECT DATEADD(DAY DATEADD(MONTH DATEADD(DAY DATEPART(DAY @Date) @Date)))
GO
其他月计算
计算给定日期所在月的上月第一天
DECLARE @Date DATETIME
SET @Date=GETDATE()
当前月第一天减去一个月
SELECT DATEADD(MONTH DATEADD(MONTH DATEDIFF(MONTH @Date) )) AS 上月第一天
简化
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date) ) AS 上月第一天
另一种当前月第一天算法
SELECT DATEADD(MONTH DATEADD(DAY DATEPART(DAY @Date) @Date)) 上月第一天
GO
计算给定日期所在月的上月最后一天
DECLARE @Date DATETIME
SET @Date=GETDATE()
当前月第一天减去一天
SELECT DATEADD(DAY DATEADD(MONTH DATEDIFF(MONTH @Date) )) AS 上月最后一天
另一种当前月第一天算法
SELECT DATEADD(DAY DATEADD(DAY DATEPART(DAY @Date) @Date)) 上月最后一天
SELECT DATEADD(DAY DATEPART(DAY @Date) @Date) 上月最后一天
另一种算法 不能用当前月的最后一天加一个月 因为当前月可能是 天
例如 SELECT DATEADD(MONTH ) 结果是 而不是
这也是月末算法采用下月第一天减 天计算的原因
但是如果计算月是 天择无此问题
例如 SELECT DATEADD(MONTH ) 结果是
因此下面算法是正确的 表示 : : SELECT CONVERT(DATETIME )
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date) )
另一种当前月算法
SELECT DATEADD(DAY DATEADD(DAY DATEPART(DAY @Date) @Date)) 上月最后一天
简化
SELECT DATEADD(DAY DATEPART(DAY @Date) @Date) 上月最后一天
GO
计算给定日期所在月的下月第一天
DECLARE @Date DATETIME
SET @Date=GETDATE()
当前月第一天加一个月
SELECT DATEADD(MONTH DATEADD(MONTH DATEDIFF(MONTH @Date) )) AS 下月第一天
简化
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date)+ ) AS 下月第一天
另一种当前月第一天算法
SELECT DATEADD(MONTH DATEADD(DAY DATEPART(DAY @Date) @Date)) 下月第一天
GO
计算给定日期所在月的下月最后一天
DECLARE @Date DATETIME
SET @Date=GETDATE()
当前月第一天加 个月再减去 天
SELECT DATEADD(DAY DATEADD(MONTH DATEADD(MONTH DATEDIFF(MONTH @Date) ))) AS 下月最后一天
简化
SELECT DATEADD(DAY DATEADD(MONTH DATEDIFF(MONTH @Date)+ )) AS 下月最后一天
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date)+ ) AS 下月最后一天
另一种算法
SELECT DATEADD(MONTH DATEDIFF(MONTH @Date)+ ) 下月最后一天
另一种当前月第一天算法
SELECT DATEADD(DAY DATEADD(MONTH DATEADD(DAY DATEPART(DAY @Date) @Date))) 下月最后一天
GO
所在星期的第一天 计算给定日期所在星期的第 天(星期日为第一天)
DECLARE @Date DATETIME
SET @Date= GETDATE()
与SQL Server语言版本相关的算法
思路 当前日期+星期日(每周的第 天)与当前日期的差的天数
DATEPART(WEEKDAY DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(WEEKDAY DATEPART(WEEKDAY @Date) @Date) AS 所在星期的第一天 星期日
星期日 与SQL Server语言版本或@@DATEFIRST无关
是星期日 再加上(当前日期与 差的星期数)个星期
SELECT DATEADD(WEEK DATEDIFF(WEEK @Date) ) AS 所在星期的星期日
或者
SELECT DATEADD(WEEK DATEDIFF(WEEK @Date) ) AS 所在星期的星期日
GO
所在星期的第二天 计算给定日期所在星期的第 天(星期日为第一天)
DECLARE @Date DATETIME
SET @Date= GETDATE()
思路 当前日期+星期一(每周的第 天)与当前日期的差的天数
DATEPART(WEEKDAY DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(DAY DATEPART(WEEKDAY @Date) @Date) AS 所在星期的第二天 星期一
星期一 与SQL Server语言版本或@@DATEFIRST无关
是星期一 再加上(当前日期与 差的星期数)个星期
SELECT DATEADD(WEEK DATEDIFF(WEEK @Date) ) AS 所在星期的星期一
GO
上个星期第一天 计算给定日期所在星期的上一个星期日(星期日为第一天)
DECLARE @Date DATETIME
SET @Date= GETDATE()
思路 当前日志所在星期的星期日再减 周
DATEPART(WEEKDAY DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(WEEK DATEADD(DAY DATEPART(WEEKDAY @Date) @Date)) AS 上个星期第一天 星期日
一周等于 天
SELECT DATEADD(DAY DATEADD(DAY DATEPART(WEEKDAY @Date) @Date)) AS 上个星期第一天 星期日
简化
SELECT DATEADD(DAY DATEPART(WEEKDAY @Date) @Date) AS 上个星期第一天 星期日
上个星期日 与SQL Server语言版本或@@DATEFIRST无关
SELECT DATEADD(WEEK +DATEDIFF(WEEK @Date) ) AS 上个星期日
或者
SELECT DATEADD(WEEK DATEDIFF(WEEK @Date) ) AS 上个星期日
GO
下个星期第一天 计算给定日期所在星期的下一个星期日(星期日为第一天)
DECLARE @Date DATETIME
SET @Date= GETDATE()
思路 当前日志所在星期的星期日再加 周
DATEPART(WEEKDAY DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(WEEK DATEADD(DAY DATEPART(WEEKDAY @Date) @Date)) AS 下个星期第一天 星期日
一周等于 天
SELECT DATEADD(DAY DATEADD(DAY DATEPART(WEEKDAY @Date) @Date)) AS 下个星期第一天 星期日
简化
SELECT DATEADD(DAY DATEPART(WEEKDAY @Date) @Date) AS 下个星期第一天 星期日
下个星期日 与SQL Server语言版本或@@DATEFIRST无关
SELECT DATEADD(WEEK +DATEDIFF(WEEK @Date) ) AS 下个星期日
或者
SELECT DATEADD(WEEK DATEDIFF(WEEK @Date) ) AS 下个星期日
GO
判断给定日期是星期几
DECLARE @Date DATETIME
SET @Date= GETDATE()
DATEPART(WEEKDAY DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEPART(WEEKDAY @Date) 返回值 星期日 星期一 星期二 星期六
上面算法与SQL 语言版本或 @@DATEFIRST 相关
下面算法与SQL Server语言版本或@@DATEFIRST无关
SELECT DATENAME(WEEKDAY @Date) 星期
GO
年度计算
DECLARE @Date DATETIME
SET @Date=GETDATE()
年初 计算给定日期所在年的第一天
SELECT DATEADD(YEAR DATEDIFF(YEAR @Date) ) AS 所在年的第一天
年末 计算给定日期所在年的最后一天
SELECT DATEADD(YEAR DATEDIFF(YEAR @Date) ) AS 所在年的最后一天
上一年年初 计算给定日期所在年的上一年的第一天
SELECT DATEADD(YEAR DATEDIFF(YEAR @Date) ) AS 所在年的上一年的第一天
上一年年末 计算给定日期所在年的上一年的最后一天
SELECT DATEADD(YEAR DATEDIFF(YEAR @Date) ) AS 所在年的上一年的最后一天
下一年年初 计算给定日期所在年的下一年的第一天
SELECT DATEADD(YEAR +DATEDIFF(YEAR @Date) ) AS 所在年的下一年的第一天
下一年年末 计算给定日期所在年的下一年的最后一天
SELECT DATEADD(YEAR +DATEDIFF(YEAR @Date) ) AS 所在年的下一年的最后一天
GO
季度计算
DECLARE @Date DATETIME
SET @Date=GETDATE()
季度初 计算给定日期所在季度的第一天
SELECT DATEADD(QUARTER DATEDIFF(QUARTER @Date) ) AS 当前季度的第一天
季度末 计算给定日期所在季度的最后一天
SELECT DATEADD(QUARTER +DATEDIFF(QUARTER @Date) ) AS 当前季度的最后一天
上个季度初
SELECT DATEADD(QUARTER DATEDIFF(QUARTER @Date) ) AS 当前季度的上个季度初
上个季度末
SELECT DATEADD(QUARTER DATEDIFF(QUARTER @Date) ) AS 当前季度的上个季度末
下个季度初
SELECT DATEADD(QUARTER +DATEDIFF(QUARTER @Date) ) AS 当前季度的下个季度初
下个季度末
SELECT DATEADD(QUARTER +DATEDIFF(QUARTER @Date) ) AS 当前季度的下个季度末
计算给定日期所在月的天数
DECLARE @Date DATETIME;
SET @Date = GETDATE()
本月度第一天与下月度第一天所差的天数
SELECT DATEDIFF(DAY DATEADD(MONTH DATEDIFF(MONTH @Date) ) DATEADD(MONTH +DATEDIFF(MONTH @Date) ))
借助变量简化
SELECT @Date = DATEADD(MONTH DATEDIFF(MONTH @Date) ) 本月度第一天
SELECT DATEDIFF(DAY @Date DATEADD(MONTH @Date))
另一种思路 给定月最后一天的日期 记为本月天数
SELECT DAY(DATEADD(MONTH DATEDIFF(MONTH @Date) ))
GO
计算给定日期所在季度的天数
DECLARE @Date DATETIME;
SET @Date = GETDATE()
本季度第一天与下季度第一天所差的天数
SELECT DATEDIFF(DAY DATEADD(QUARTER DATEDIFF(QUARTER @Date) ) DATEADD(QUARTER +DATEDIFF(QUARTER @Date) ))
借助变量简化
SELECT @Date = DATEADD(QUARTER DATEDIFF(QUARTER @Date) ) 本季度第一天
SELECT DATEDIFF(DAY @Date DATEADD(QUARTER @Date))
GO
计算给定日期所在年度的天数
DECLARE @Date DATETIME;
SET @Date = GETDATE()
本年度第一天与下年度第一天所差的天数
SELECT DATEDIFF(DAY DATEADD(YEAR DATEDIFF(YEAR @Date) ) DATEADD(YEAR +DATEDIFF(YEAR @Date) ))
借助变量简化
SELECT @Date = DATEADD(YEAR DATEDIFF(YEAR @Date) ) 本年度第一天
SELECT DATEDIFF(DAY @Date DATEADD(YEAR @Date))
GO
判断给定日期所在年是否闰年
根据全年总天数判断
DECLARE @Date DATETIME;
SET @Date = GETDATE()
SELECT CASE DATEDIFF(DAY DATEADD(YEAR DATEDIFF(YEAR @Date) ) DATEADD(YEAR +DATEDIFF(YEAR @Date) ))
WHEN THEN 平年 ELSE 闰年 END
根据二月天数判断
给日期的上一年最后一天加 个月 即为当年 月最后一天
SELECT CASE DAY(DATEADD(MONTH DATEADD(YEAR DATEDIFF(YEAR @Date) ))) WHEN THEN 平年 ELSE 闰年 END
GO
计算给定日期是当年的第几天
DECLARE @Date DATETIME;
SET @Date = GETDATE()
SELECT DATEPART(DAYOFYEAR @Date) [DayOfYear];
SELECT DATENAME(DAYOFYEAR @Date) [DayOfYear];
另一种思路 当前日期与上年最后一天差的天数
SELECT DATEDIFF(DAY DATEADD(YEAR DATEDIFF(YEAR @Date) ) @Date)[DayOfYear]
GO
计算给定日期是当年的第几周
DECLARE @Date DATETIME;
SET @Date = GETDATE()
SELECT DATEPART(WEEK @Date) [WeekOfYear]; 返回int型
SELECT DATENAME(WEEK @Date) [WeekOfYear]; 返回varchar型
GO
计算给定日期是当年的第几月
DECLARE @Date DATETIME;
SET @Date = GETDATE()
SELECT DATEPART(MONTH @Date) [MonthOfYear]; 返回int型
SELECT DATENAME(MONTH @Date) [MonthOfYear]; 返回varchar型
SELECT MONTH(@Date) [MonthOfYear]; 返回int型
GO
计算给定日期是当年的第几季度
DECLARE @Date DATETIME;
SET @Date = GETDATE()
SELECT DATEPART(QUARTER @Date) [QuarterOfYear]; 返回int型
SELECT DATENAME(QUARTER @Date) [QuarterOfYear]; 返回varchar型
GO
计算给定日期是当月的第几周
DECLARE @Date DATETIME;
SET @Date = GETDATE()
思路 给定日期是当年的第几周 给定日期所在月第一天是当年的第几周
SELECT DATEPART(WEEK @Date) DATEPART(WEEK DATEADD(MONTH DATEDIFF(MONTH @Date) ))+ [WeekOfMonth]
SELECT DATEPART(WEEK @Date) DATEPART(WEEK DATEADD(DAY DATEPART(DAY @Date) @Date))+ [WeekOfMonth]
GO
计算给定日期所在月的第一个星期一是哪天
DECLARE @Date DATETIME;
SET @Date = GETDATE()
思路 (星期一)加上(给定日志所在月的月 号与 差的周数)个周
为什么不选 号?如果是 号 那么 好恰好是星期日的话 第一个周一就会算到 号
为什么不选 号?如果 号是星期六 那么周一就跑到上月了 小于 号与这个道理一样
SELECT DATEADD(WEEK DATEDIFF(WEEK DATEADD(DAY DATEPART(DAY @Date) @Date)) ) 所在月的第一个星期一
SELECT DATEADD(WEEK DATEDIFF(WEEK DATEADD(DAY DATEPART(DAY @Date) @Date)) ) 所在月的第二个星期一
SELECT DATEADD(WEEK DATEDIFF(WEEK DATEADD(DAY DATEPART(DAY @Date) @Date)) ) 所在月的第一个星期二
SELECT DATEADD(WEEK DATEDIFF(WEEK DATEADD(DAY DATEPART(DAY @Date) @Date)) ) 所在月的第二个星期二
cha138/Article/program/SQLServer/201311/22257相关参考
SQLServer应用程序中的高级SQL注入 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 摘要
SQLServer中的事务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 事务的含义 事务要有
知识大全 Microsoft SQL Server 2000 中的位图
MicrosoftSQLServer2000中的位图 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 SQL Server 2008 中的hierarchyid类型应用
SQLServer2008中的hierarchyid类型应用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
知识大全 SQL Server 中的事务(含义,属性,管理)
SQLServer中的事务(含义,属性,管理) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 含
如何识别SQLServer中的IO瓶颈 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题 我
知识大全 使用 SQL Server 2005中的 CLR 集成(2)
使用SQLServer2005中的CLR集成(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 使用 SQL Server 2005中的 CLR 集成(3)
使用SQLServer2005中的CLR集成(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 使用 SQL Server 2005中的 CLR 集成(1)
使用SQLServer2005中的CLR集成(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
将SQLServer中的表变成txt文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 方法一用