知识大全 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

相关参考

知识大全 SQL Server应用程序中的高级SQL注入

SQLServer应用程序中的高级SQL注入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要

知识大全 SQL Server 中的事务

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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  含

知识大全 如何识别SQL Server中的IO瓶颈

如何识别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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 将SQL Server中的表变成txt文件

将SQLServer中的表变成txt文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  方法一用