[MYSQL] ランダムに誕生日年とか欲しくて - FUNCTION です。
2013/01/26
mysql
日付
乱数
mysqlのFUNCTION です。
ある年月日からある年月日までの間の年月日をランダムに生成したいなと思いました。
MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.5 日付時刻関数
MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.6 MySQL が使用するカレンダーは ?
以下のFUNCTION RANDOM_BIRTH() は、1940-01-01から 2012-12-31 の間の日にちをランダムに生成します。
今回使ったのはFROM_DAYSという関数です。この関数日数をうけとってDATEで返してくれます。この日数がいつからのものかというがわからないので、TO_DAYSで事前に調べておくというのが面倒ですかね。
-- mysql5 -u root work < FUNCTION_RANDOM.sql
-- 再定義用
DROP FUNCTION IF EXISTS RANDOM;
DROP FUNCTION IF EXISTS RANDOM_BIRTH;
DROP PROCEDURE IF EXISTS MAIN;
delimiter //
CREATE FUNCTION RANDOM(i INT, j INT) RETURNS INT
NO SQL
BEGIN
-- i <= r < j
RETURN FLOOR(i + (RAND() * (j - i)));
END;
CREATE FUNCTION RANDOM_BIRTH() RETURNS DATE
NO SQL
BEGIN
DECLARE i INT DEFAULT 0;
-- SELECT TO_DAYS('1940-01-01'); 708570
-- SELECT TO_DAYS('2013-01-01'); 735234
-- SELECT FROM_DAYS(708570 + 26663);
-- FROM 1940-01-01 TO 2012-12-31
SET i = RANDOM(0,26664);-- 735234 - 708570
-- グレゴリウス暦からもとめる
RETURN FROM_DAYS(708570 + i);
END;
CREATE PROCEDURE MAIN()
BEGIN
SELECT RANDOM_BIRTH();
END
//
-- 呼び出し
CALL MAIN();
-- とりあえずあったら消しておく
DROP FUNCTION IF EXISTS RANDOM;
DROP FUNCTION IF EXISTS RANDOM_BIRTH;
DROP PROCEDURE IF EXISTS MAIN;
SHOW WARNINGS;
: