dateDiff

指定された2つの日付の時間間隔を返します。

構文
dateDiff( interval, date1, date2 )
引数
interval
時間単位(yyyy︰年、m︰月、d︰日)
date1
日時1
date2
日時2
戻値
date2からdate1を引いた日数を求めます。

プログラム

//////////////////////////////////////////////////
// 【引数】
//   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

解説

  1. 2行目
    	DIM y1, y2, m1, m2, d1, d2, d
    
    date1の年、date2の年、date1の月、date2の月、date1の日、date2の日、戻値。
  2. 3行目
    	SELECT interval
    
    intervalの値によって分岐。
    yyyy
    4行目>>>
    m
    10行目>>>
    d
    18行目>>>
  3. 4-9行目
    		CASE "yyyy"
    			GETTIME(0, date1)
    			y1 = G_TIME_YY
    			GETTIME(0, date2)
    			y2 = G_TIME_YY
    			d = y2 - y1
    
    date1の年をy1に、date2の年をy2に代入。y2-y1で差を計算。
  4. 10-17行目
    		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
    
    date1の年をy1、月をm1、date2の年をy2、月をm2に代入。(y2-y1)×12とm2-m1の和で差を計算。
  5. 18-21行目
    		CASE "d"
    			d1 = GETTIME(0, date1)
    			d2 = GETTIME(0, date2)
    			d = (d2 - d1) / 86400
    
    GETTIME関数でdate1、date2のUWSC時間を取得する。GETTIMEの戻値の単位は秒なので、d2-d1を86400で割ることで日単位にします。
  6. 23行目
    	RESULT = d
    
    変数dを戻値として返す。

プログラム実行例

今月の残りの日数を返す

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

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

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)