Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: เพิ่มแถวพร้อม Timestamp แบบสุ่ม "X วันที่แล้ว" ด้วย RAND()

รูปแบบคำสั่ง

INSERT INTO yourTableName VALUES (CURRENT_TIMESTAMP - INTERVAL ABS(RAND() * 100) DAY);

สร้างตารางและทดสอบ

mysql> create table DemoTable1983 ( DueDate timestamp );
mysql> insert into DemoTable1983 values(CURRENT_TIMESTAMP - INTERVAL ABS(RAND() * 100) DAY);
mysql> insert into DemoTable1983 values(CURRENT_TIMESTAMP - INTERVAL ABS(RAND() * 100) DAY);
mysql> insert into DemoTable1983 values(CURRENT_TIMESTAMP - INTERVAL ABS(RAND() * 100) DAY);

ผลลัพธ์ตัวอย่าง (วันที่รันคือ 2019-12-18 19:36:17)

+---------------------+
| DueDate             |
+---------------------+
| 2019-12-10 19:35:43 |
| 2019-10-27 19:35:44 |
| 2019-11-10 19:35:45 |
+---------------------+

อธิบายการทำงาน

  1. RAND() สร้างเลขสุ่ม 0.0000... ถึง 0.9999...
  2. RAND() * 100 → 0 ถึง 99.99...
  3. ABS(...) ค่าสัมบูรณ์ (ป้องกันค่าลบ แม้ RAND() จะไม่ติดลบ)
  4. INTERVAL ... DAY แปลงเป็นช่วงเวลาวัน
  5. CURRENT_TIMESTAMP - ... ลบย้อนหลังจากเวลาปัจจุบัน

ปรับช่วงวันที่สุ่ม

-- สุ่ม 0-30 วัน (1 เดือน)
CURRENT_TIMESTAMP - INTERVAL FLOOR(RAND() * 30) DAY

-- สุ่ม 0-365 วัน (1 ปี)
CURRENT_TIMESTAMP - INTERVAL FLOOR(RAND() * 365) DAY

-- สุ่มระหว่าง 30-60 วันก่อน
CURRENT_TIMESTAMP - INTERVAL (30 + FLOOR(RAND() * 30)) DAY

ใช้กับ DATE แทน TIMESTAMP

INSERT INTO table (date_col) VALUES (CURDATE() - INTERVAL FLOOR(RAND() * 100) DAY);

กรณีต้องการ Fixed Seed (Reproducible)

-- MySQL ไม่มี SET SEED() ตรงๆ แต่สามารถใช้ได้ดังนี้
SET @seed = 12345;
INSERT INTO table VALUES (CURRENT_TIMESTAMP - INTERVAL ABS(RAND(@seed) * 100) DAY);