getEndOfMonth

date から m 月後の月末の日付を返します。m は正の値で未来、負の値で過去になります。

構文
UString = getEndOfMonth( date, m )
引数
date
日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)
m
第一引数の指定日からプラスマイナス m 月とする(デフォルト=0)
戻値
date から m 月後の月末の日付

プログラム

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
//   m : 第一引数の指定日からプラスマイナス m 月とする(デフォルト=0) 
// 【戻値】
//   date から m 月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	GETTIME(0, date)
	IFB m >= 0 THEN
		year = G_TIME_YY + INT((G_TIME_MM + m + 1) / 12)
		month = REPLACE(FORMAT(((G_TIME_MM + m + 1) MOD 12), 2), " ", "0")
	ELSE
		year = G_TIME_YY + CEIL((G_TIME_MM + m + 1) / 12 - 1)
		month = REPLACE(FORMAT(G_TIME_MM - (ABS(m + 1) MOD 12), 2), " ", "0")
		IF EVAL(month) < 0 THEN month = REPLACE(FORMAT(12 + EVAL(month), 2), " ", "0")
	ENDIF
	IF month = "00" THEN month = "12"
	day = "01"
	d = "" + year + month + day
	GETTIME(-1, d)
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND

要素毎に分解

戻値をGETTIME関数の第二引数に指定すると特殊変数にセットされ要素毎に分解できます。

日付を求める関数なので、年月日以外の要素には値が代入されません。

GETTIME(0, getEndOfMonth(today()))

PRINT G_TIME_YY4 + “/” + G_TIME_MM2 + “/” + G_TIME_DD2

プログラム実行例

今月末の日付を求める

PRINT getEndOfMonth(today())

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
//   m : 第一引数の指定日からプラスマイナス m 月とする(デフォルト=0) 
// 【戻値】
//   date から m 月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	GETTIME(0, date)
	IFB m >= 0 THEN
		year = G_TIME_YY + INT((G_TIME_MM + m + 1) / 12)
		month = REPLACE(FORMAT(((G_TIME_MM + m + 1) MOD 12), 2), " ", "0")
	ELSE
		year = G_TIME_YY + CEIL((G_TIME_MM + m + 1) / 12 - 1)
		month = REPLACE(FORMAT(G_TIME_MM - (ABS(m + 1) MOD 12), 2), " ", "0")
		IF EVAL(month) < 0 THEN month = REPLACE(FORMAT(12 + EVAL(month), 2), " ", "0")
	ENDIF
	IF month = "00" THEN month = "12"
	day = "01"
	d = "" + year + month + day
	GETTIME(-1, d)
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
  1. udf.getEndOfMonth(1)
  2. udf.today(1)
結果
2021/09/30

来月末の日付を求める

PRINT getEndOfMonth(today(), 1)

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
//   m : 第一引数の指定日からプラスマイナス m 月とする(デフォルト=0) 
// 【戻値】
//   date から m 月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	GETTIME(0, date)
	IFB m >= 0 THEN
		year = G_TIME_YY + INT((G_TIME_MM + m + 1) / 12)
		month = REPLACE(FORMAT(((G_TIME_MM + m + 1) MOD 12), 2), " ", "0")
	ELSE
		year = G_TIME_YY + CEIL((G_TIME_MM + m + 1) / 12 - 1)
		month = REPLACE(FORMAT(G_TIME_MM - (ABS(m + 1) MOD 12), 2), " ", "0")
		IF EVAL(month) < 0 THEN month = REPLACE(FORMAT(12 + EVAL(month), 2), " ", "0")
	ENDIF
	IF month = "00" THEN month = "12"
	day = "01"
	d = "" + year + month + day
	GETTIME(-1, d)
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
  1. udf.getEndOfMonth(1)
  2. udf.today(1)

先月末の日付を求める

PRINT getEndOfMonth(today(), -1)

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
//   m : 第一引数の指定日からプラスマイナス m 月とする(デフォルト=0) 
// 【戻値】
//   date から m 月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	GETTIME(0, date)
	IFB m >= 0 THEN
		year = G_TIME_YY + INT((G_TIME_MM + m + 1) / 12)
		month = REPLACE(FORMAT(((G_TIME_MM + m + 1) MOD 12), 2), " ", "0")
	ELSE
		year = G_TIME_YY + CEIL((G_TIME_MM + m + 1) / 12 - 1)
		month = REPLACE(FORMAT(G_TIME_MM - (ABS(m + 1) MOD 12), 2), " ", "0")
		IF EVAL(month) < 0 THEN month = REPLACE(FORMAT(12 + EVAL(month), 2), " ", "0")
	ENDIF
	IF month = "00" THEN month = "12"
	day = "01"
	d = "" + year + month + day
	GETTIME(-1, d)
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
  1. udf.getEndOfMonth(1)
  2. udf.today(1)

今月の残りの日数を返す

今日の日付から今月末までの日数の差を計算します。

明日から月末までの日数です。

PRINT dateDiff("d", today(), getEndOfMonth(today()))

//////////////////////////////////////////////////
// 【引数】
//   interval : 時間単位(yyyy︰年、m︰月、d︰日) 
//   date1 : 日時1 
//   date2 : 日時2 
// 【戻値】
//   date2からdate1を引いた日数を求めます。 
//////////////////////////////////////////////////
FUNCTION dateDiff(interval, date1, date2)
	DIM y1, y2, m1, m2, d1, d2, d
	SELECT interval
		CASE "yyyy"
			GETTIME(0, date1)
			y1 = G_TIME_YY
			GETTIME(0, date2)
			y2 = G_TIME_YY
			d = y2 - y1
		CASE "m"
			GETTIME(0, date1)
			y1 = G_TIME_YY
			m1 = G_TIME_MM
			GETTIME(0, date2)
			y2 = G_TIME_YY
			m2 = G_TIME_MM
			d = (y2 - y1) * 12 + m2 - m1
		CASE "d"
			d1 = GETTIME(0, date1)
			d2 = GETTIME(0, date2)
			d = (d2 - d1) / 86400
	SELEND
	RESULT = d
FEND

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
//   m : 第一引数の指定日からプラスマイナス m 月とする(デフォルト=0) 
// 【戻値】
//   date から m 月後の月末の日付 
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
	GETTIME(0, date)
	IFB m >= 0 THEN
		year = G_TIME_YY + INT((G_TIME_MM + m + 1) / 12)
		month = REPLACE(FORMAT(((G_TIME_MM + m + 1) MOD 12), 2), " ", "0")
	ELSE
		year = G_TIME_YY + CEIL((G_TIME_MM + m + 1) / 12 - 1)
		month = REPLACE(FORMAT(G_TIME_MM - (ABS(m + 1) MOD 12), 2), " ", "0")
		IF EVAL(month) < 0 THEN month = REPLACE(FORMAT(12 + EVAL(month), 2), " ", "0")
	ENDIF
	IF month = "00" THEN month = "12"
	day = "01"
	d = "" + year + month + day
	GETTIME(-1, d)
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
  1. udf.dateDiff(1)
  2. udf.today(1)
  3. udf.getEndOfMonth(1)