SQL文で年度の開始日と終了日を取得したい...ということで
教えてくださいなんていわれてしまったのでここにも書いときます(^^;;
激しくへっぽこですがお許しください(笑)

ちなみに
 SELECT * FROM [テーブル名]
 WHERE ([イベント発生日] >= dbo.GetBusinessYearStart(GETDATE()) AND [イベント発生日] <= dbo.GetBusinessYearEnd(GETDATE()))

という感じで使います

他にも
 SELECT * FROM [テーブル名]
 WHERE ([イベント発生日] >= dbo.GetBusinessYear(GETDATE()) AND [イベント発生日] <
DATEADD(Year, 1, dbo.GetBusinessYearEnd(GETDATE())))
として 今年の年度開始日 から 来年の年度開始日未満 とする使い方もあります
# こちらの方が datetime の精度に依存しないですね


-- @BusinessYearに指定された日付の年度を計算します
CREATE FUNCTION GetBusinessYear
 (@BusinessYear datetime)

 RETURNS datetime
AS
BEGIN
 DECLARE @BeginingBusinessDay datetime

 DECLARE @ThisYear int
 DECLARE @ThisMonth int
 DECLARE @ThisBusinessYear varchar(10)

 -- 年度の開始日を指定します
 SELECT @BeginingBusinessDay = '2000/04/01'
 -- 指定された日付の 年 と 月 と取得します
 SELECT @ThisYear = YEAR(@BusinessYear), @ThisMonth = MONTH(@BusinessYear)

 
-- 年度開始月より前の日付の場合
 IF (@ThisMonth MONTH(@BeginingBusinessDay))
  BEGIN
  -- 年 を1年戻す
  SELECT @ThisYear = @ThisYear - 1
 END

 -- 年度の初めを取得する
 SELECT @ThisBusinessYear =
 
(
  CAST(@ThisYear AS varchar(4))
   + '/' +
  CAST(MONTH(@BeginingBusinessDay) AS varchar(2))
   + '/' +
  CAST(DAY(@BeginingBusinessDay) AS varchar(2))
 )


 -- datetime型 にキャストして返す
 RETURN (CAST(@ThisBusinessYear AS datetime))
END
GO

-- 指定された日付から年度の初めを計算して返します
CREATE FUNCTION GetBusinessYearStart
 (@ThisDateTime datetime)

 
RETURNS datetime
AS

BEGIN
 DECLARE @ThisBusinessYearStart datetime

 -- 年度の初めを取得します (ユーザ定義関数を所有しているスキーマも指定します)
 SELECT @ThisBusinessYearStart = dbo.GetBusinessYear(@ThisDateTime)

 RETURN (@ThisBusinessYearStart)
END
GO

-- 指定された日付から年度の終わりを計算して返します
CREATE FUNCTION GetBusinessYearEnd
 (@ThisDateTime datetime)

 RETURNS datetime
AS
BEGIN
 DECLARE @ThisBusinessYearEnd datetime

 -- 年度の終わりを計算し取得します (ユーザ定義関数を所有しているスキーマも指定します)
 SELECT @ThisBusinessYearEnd = DATEADD(Millisecond, -3, (DATEADD(Year, 1, dbo.GetBusinessYear(@ThisDateTime))))

 RETURN (@ThisBusinessYearEnd)
END
GO

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Comments

Comments are closed