質問: Oracleを用いて、ランダムな日付を取得するには、 以下のようなSQLを実行すれば良いことを学びました。 --2016/01/01から2016/12/31のランダム日付を取得する例 SELECT TO_DATE('20160101','YYYYMMDD') +MOD(ABS(DBMS_RANDOM.RANDOM()) ,TO_DATE('20170101','YYYYMMDD')-TO_DATE('20160101','YYYYMMDD')) DT from dual; なぜこの方法でランダムな日付を得ることが出来るのでしょうか? 2016年01月01日という日付に対して、0~364(365?)の日付を 足そうとしていることは推測できます。 しかし、 MOD(ABS(DBMS_RANDOM.RANDOM()) ,TO_DATE('20170101','YYYYMMDD')-TO_DATE('20160101','YYYYMMDD')) によって、なぜ0~364の日付を得ることが出来るのでしょうか? ・TO_DATE(~)-TO_DATE(~)の部分は、1年分の日付差異 ・ABS(DBMS_RANDOM.RANDOM())は0~2^31の乱数 となるかと思いますが、MODを用いて余りを求めると、 0~364の日付を得られることに合点がいきません。 どなたか、納得のいくお答えをいただけないでしょうか。
回答: 365 で割った余りは必ず 0~364 の範囲になります。つまり乱数を 365 で割った余りは 0~364 の乱数になります。