熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL Server 中的時間算法

2013-11-15 14:44:06  來源: SQL Server 

  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(MONTHDATEDIFF(MONTH@Date)) AS 所在月的第一天

  精簡算法根據SQL Server的時間表示方式可知 可以用代替

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)) AS 所在月的第一天

  上面兩種算法精確到天 時分秒均為::

  下面算法課以保留時分秒

  思路用給定日期減去月第一天與給定日期差的天數

  SELECT DATEADD(DAYDATEPART(DAY@Date)@Date)

  GO

  月末計算給定日期所在月的最後一天

  DECLARE @Date DATETIME

  SET @Date=GETDATE()

  思路當前月的下一月號在減

  SELECT DATEADD(DAYDATEADD(MONTH+DATEDIFF(MONTH@Date))) AS 所在月的最一天

  SELECT DATEADD(MONTH+DATEDIFF(MONTH@Date)) AS 所在月的最一天

  代替

  SELECT DATEADD(DAYDATEADD(MONTH+DATEDIFF(MONTH@Date))) AS 所在月的最一天

  SELECT DATEADD(MONTH+DATEDIFF(MONTH@Date)) AS 所在月的最一天

  思路與月初計算思路相同

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)) AS 所在月的最一天

  精簡算法代替

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)) AS 所在月的最一天

  保留時分秒的算法

  SELECT DATEADD(DAYDATEADD(MONTHDATEADD(DAYDATEPART(DAY@Date)@Date)))

  GO

  其他月計算

  計算給定日期所在月的上月第一天

  DECLARE @Date DATETIME

  SET @Date=GETDATE()

  當前月第一天減去一個月

  SELECT DATEADD(MONTHDATEADD(MONTHDATEDIFF(MONTH@Date))) AS 上月第一天

  簡化

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)) AS 上月第一天

  另一種當前月第一天算法

  SELECT DATEADD(MONTHDATEADD(DAYDATEPART(DAY@Date)@Date)) 上月第一天

  GO

  計算給定日期所在月的上月最後一天

  DECLARE @Date DATETIME

  SET @Date=GETDATE()

  當前月第一天減去一天

  SELECT DATEADD(DAYDATEADD(MONTHDATEDIFF(MONTH@Date))) AS 上月最後一天

  另一種當前月第一天算法

  SELECT DATEADD(DAYDATEADD(DAYDATEPART(DAY@Date)@Date)) 上月最後一天

  SELECT DATEADD(DAYDATEPART(DAY@Date)@Date) 上月最後一天

  另一種算法不能用當前月的最後一天加一個月因為當前月可能是

  例如 SELECT DATEADD(MONTH) 結果是而不是

  這也是月末算法采用下月第一天減天計算的原因

  但是如果計算月是天擇無此問題

  例如 SELECT DATEADD(MONTH) 結果是

  因此下面算法是正確的 表示 :: SELECT CONVERT(DATETIME)

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date))

  另一種當前月算法

  SELECT DATEADD(DAYDATEADD(DAYDATEPART(DAY@Date)@Date)) 上月最後一天

  簡化

  SELECT DATEADD(DAYDATEPART(DAY@Date)@Date) 上月最後一天

  GO

  計算給定日期所在月的下月第一天

  DECLARE @Date DATETIME

  SET @Date=GETDATE()

  當前月第一天加一個月

  SELECT DATEADD(MONTHDATEADD(MONTHDATEDIFF(MONTH@Date))) AS 下月第一天

  簡化

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)+) AS 下月第一天

  另一種當前月第一天算法

  SELECT DATEADD(MONTHDATEADD(DAYDATEPART(DAY@Date)@Date)) 下月第一天

  GO

  計算給定日期所在月的下月最後一天

  DECLARE @Date DATETIME

  SET @Date=GETDATE()

  當前月第一天加個月再減去

  SELECT DATEADD(DAYDATEADD(MONTHDATEADD(MONTHDATEDIFF(MONTH@Date)))) AS 下月最後一天

  簡化

  SELECT DATEADD(DAYDATEADD(MONTHDATEDIFF(MONTH@Date)+)) AS 下月最後一天

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)+) AS 下月最後一天

  另一種算法

  SELECT DATEADD(MONTHDATEDIFF(MONTH@Date)+) 下月最後一天

  另一種當前月第一天算法

  SELECT DATEADD(DAYDATEADD(MONTHDATEADD(DAYDATEPART(DAY@Date)@Date))) 下月最後一天

  GO

  所在星期的第一天計算給定日期所在星期的第天(星期日為第一天)

  DECLARE @Date DATETIME

  SET @Date= GETDATE()

  與SQL Server語言版本相關的算法

  思路當前日期+星期日(每周的第天)與當前日期的差的天數

  DATEPART(WEEKDAYDATE)的返回值與@@DATEFIRST相關

  SET DATEFIRST 或者設置為美國英語SET LANGUAGE us_english; (星期日為第一天)

  SELECT DATEADD(WEEKDAYDATEPART(WEEKDAY@Date)@Date) AS 所在星期的第一天星期日

  星期日與SQL Server語言版本或@@DATEFIRST無關

   是星期日 再加上(當前日期與差的星期數)個星期

  SELECT DATEADD(WEEKDATEDIFF(WEEK@Date)) AS 所在星期的星期日

  或者

  SELECT DATEADD(WEEKDATEDIFF(WEEK@Date)) AS 所在星期的星期日

  GO

  所在星期的第二天計算給定日期所在星期的第天(星期日為第一天)

  DECLARE @Date DATETIME

  SET @Date= GETDATE()

  思路當前日期+星期一(每周的第天)與當前日期的差的天數

  DATEPART(WEEKDAYDATE)的返回值與@@DATEFIRST相關

  SET DATEFIRST 或者設置為美國英語SET LANGUAGE us_english; (星期日為第一天)

  SELECT DATEADD(DAYDATEPART(WEEKDAY@Date)@Date) AS 所在星期的第二天星期一

  星期一與SQL Server語言版本或@@DATEFIRST無關

   是星期一 再加上(當前日期與差的星期數)個星期

  SELECT DATEADD(WEEKDATEDIFF(WEEK@Date)) AS 所在星期的星期一

  GO

  上個星期第一天計算給定日期所在星期的上一個星期日(星期日為第一天)

  DECLARE @Date DATETIME

  SET @Date= GETDATE()

  思路當前日志所在星期的星期日再減

  DATEPART(WEEKDAYDATE)的返回值與@@DATEFIRST相關

  SET DATEFIRST 或者設置為美國英語SET LANGUAGE us_english; (星期日為第一天)

  SELECT DATEADD(WEEKDATEADD(DAYDATEPART(WEEKDAY@Date)@Date)) AS 上個星期第一天星期日

  一周等於

  SELECT DATEADD(DAYDATEADD(DAYDATEPART(WEEKDAY@Date)@Date)) AS 上個星期第一天星期日

  簡化

  SELECT DATEADD(DAYDATEPART(WEEKDAY@Date)@Date) AS 上個星期第一天星期日

  上個星期日與SQL Server語言版本或@@DATEFIRST無關

  SELECT DATEADD(WEEK+DATEDIFF(WEEK@Date)) AS 上個星期日

  或者

  SELECT DATEADD(WEEKDATEDIFF(WEEK@Date)) AS 上個星期日

  GO

  下個星期第一天計算給定日期所在星期的下一個星期日(星期日為第一天)

  DECLARE @Date DATETIME

  SET @Date= GETDATE()

  思路當前日志所在星期的星期日再加

  DATEPART(WEEKDAYDATE)的返回值與@@DATEFIRST相關

  SET DATEFIRST 或者設置為美國英語SET LANGUAGE us_english; (星期日為第一天)

  SELECT DATEADD(WEEKDATEADD(DAYDATEPART(WEEKDAY@Date)@Date)) AS 下個星期第一天星期日

  一周等於

  SELECT DATEADD(DAYDATEADD(DAYDATEPART(WEEKDAY@Date)@Date)) AS 下個星期第一天星期日

  簡化

  SELECT DATEADD(DAYDATEPART(WEEKDAY@Date)@Date) AS 下個星期第一天星期日

  下個星期日與SQL Server語言版本或@@DATEFIRST無關

  SELECT DATEADD(WEEK+DATEDIFF(WEEK@Date)) AS 下個星期日

  或者

  SELECT DATEADD(WEEKDATEDIFF(WEEK@Date)) AS 下個星期日

  GO

  判斷給定日期是星期幾

  DECLARE @Date DATETIME

  SET @Date= GETDATE()

  DATEPART(WEEKDAYDATE)的返回值與@@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(YEARDATEDIFF(YEAR@Date)) AS 所在年的第一天

  年末計算給定日期所在年的最後一天

  SELECT DATEADD(YEARDATEDIFF(YEAR@Date)) AS 所在年的最後一天

  上一年年初計算給定日期所在年的上一年的第一天

  SELECT DATEADD(YEARDATEDIFF(YEAR@Date)) AS 所在年的上一年的第一天

  上一年年末計算給定日期所在年的上一年的最後一天

  SELECT DATEADD(YEARDATEDIFF(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(QUARTERDATEDIFF(QUARTER@Date)) AS 當前季度的第一天

  季度末計算給定日期所在季度的最後一天

  SELECT DATEADD(QUARTER+DATEDIFF(QUARTER@Date)) AS 當前季度的最後一天

  上個季度初

  SELECT DATEADD(QUARTERDATEDIFF(QUARTER@Date)) AS 當前季度的上個季度初

  上個季度末

  SELECT DATEADD(QUARTERDATEDIFF(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(DAYDATEADD(MONTHDATEDIFF(MONTH@Date))DATEADD(MONTH+DATEDIFF(MONTH@Date)))

  借助變量簡化

  SELECT @Date = DATEADD(MONTHDATEDIFF(MONTH@Date)) 本月度第一天

  SELECT DATEDIFF(DAY@DateDATEADD(MONTH@Date))

  另一種思路給定月最後一天的日期記為本月天數

  SELECT DAY(DATEADD(MONTHDATEDIFF(MONTH@Date)))

  GO

  計算給定日期所在季度的天數

  DECLARE @Date DATETIME;

  SET @Date = GETDATE()

  本季度第一天與下季度第一天所差的天數

  SELECT DATEDIFF(DAYDATEADD(QUARTERDATEDIFF(QUARTER@Date))DATEADD(QUARTER+DATEDIFF(QUARTER@Date)))

  借助變量簡化

  SELECT @Date = DATEADD(QUARTERDATEDIFF(QUARTER@Date)) 本季度第一天

  SELECT DATEDIFF(DAY@DateDATEADD(QUARTER@Date))

  GO

  計算給定日期所在年度的天數

  DECLARE @Date DATETIME;

  SET @Date = GETDATE()

  本年度第一天與下年度第一天所差的天數

  SELECT DATEDIFF(DAYDATEADD(YEARDATEDIFF(YEAR@Date))DATEADD(YEAR+DATEDIFF(YEAR@Date)))

  借助變量簡化

  SELECT @Date = DATEADD(YEARDATEDIFF(YEAR@Date)) 本年度第一天

  SELECT DATEDIFF(DAY@DateDATEADD(YEAR@Date))

  GO

  判斷給定日期所在年是否閏年

  根據全年總天數判斷

  DECLARE @Date DATETIME;

  SET @Date = GETDATE()

  SELECT CASE DATEDIFF(DAYDATEADD(YEARDATEDIFF(YEAR@Date))DATEADD(YEAR+DATEDIFF(YEAR@Date)))

  WHEN THEN 平年 ELSE 閏年 END

  根據二月天數判斷

  給日期的上一年最後一天加個月即為當年月最後一天

  SELECT CASE DAY(DATEADD(MONTHDATEADD(YEARDATEDIFF(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(DAYDATEADD(YEARDATEDIFF(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(WEEKDATEADD(MONTHDATEDIFF(MONTH@Date)))+ [WeekOfMonth]

  SELECT DATEPART(WEEK@Date)DATEPART(WEEKDATEADD(DAYDATEPART(DAY@Date)@Date))+ [WeekOfMonth]

  GO

  計算給定日期所在月的第一個星期一是哪天

  DECLARE @Date DATETIME;

  SET @Date = GETDATE()

  思路(星期一)加上(給定日志所在月的月號與差的周數)個周

  為什麼不選號?如果是那麼好恰好是星期日的話第一個周一就會算到

  為什麼不選號?如果號是星期六那麼周一就跑到上月了小於號與這個道理一樣

  SELECT DATEADD(WEEKDATEDIFF(WEEKDATEADD(DAYDATEPART(DAY@Date)@Date))) 所在月的第一個星期一

  SELECT DATEADD(WEEKDATEDIFF(WEEKDATEADD(DAYDATEPART(DAY@Date)@Date))) 所在月的第二個星期一

  SELECT DATEADD(WEEKDATEDIFF(WEEKDATEADD(DAYDATEPART(DAY@Date)@Date))) 所在月的第一個星期二

  SELECT DATEADD(WEEKDATEDIFF(WEEKDATEADD(DAYDATEPART(DAY@Date)@Date))) 所在月的第二個星期二

  GO


From:http://tw.wingwit.com/Article/program/SQLServer/201311/22257.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.