回答編集履歴

4

テキスト修正

2018/01/13 02:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -533,3 +533,67 @@
533
533
  ORDER BY DateTime;
534
534
 
535
535
  ```
536
+
537
+
538
+
539
+ ---
540
+
541
+ **追記3**
542
+
543
+
544
+
545
+ 別解を思いつきました。
546
+
547
+ 以下のようにすると、30分ごと、1時間ごと、3時間ごと のいずれも同じSQLで、
548
+
549
+ 時間間隔のパラメータだけを変えればよくなります。
550
+
551
+
552
+
553
+ 30分ごとのレコードは以下のようなクエリで取れます。
554
+
555
+
556
+
557
+ ```SQL
558
+
559
+ SELECT * FROM Wind
560
+
561
+ WHERE
562
+
563
+ MOD(UNIX_TIMESTAMP(DateTime) - UNIX_TIMESTAMP('2018-01-12 17:30:00'), 30 * 60) = 0
564
+
565
+ ORDER BY DateTime;
566
+
567
+ ```
568
+
569
+ 結果:
570
+
571
+ ```
572
+
573
+ +---------------------+---------+--------+
574
+
575
+ | DateTime | WindDir | AirVol |
576
+
577
+ +---------------------+---------+--------+
578
+
579
+ | 2018-01-12 17:30:00 | 240 | 30 |
580
+
581
+ | 2018-01-12 18:00:00 | 240 | 45 |
582
+
583
+ | 2018-01-12 18:30:00 | 270 | 40 |
584
+
585
+ | 2018-01-12 19:00:00 | 250 | 50 |
586
+
587
+ | 2018-01-12 19:30:00 | 280 | 35 |
588
+
589
+ | 2018-01-12 20:00:00 | 230 | 40 |
590
+
591
+ ・・・
592
+
593
+ ```
594
+
595
+
596
+
597
+ 上記のクエリで、 `30 * 60` という掛け算がありますが、これは、30分を秒数に換算する式です。
598
+
599
+ ですので、1時間おきなら、`60 * 60` 、3時間おきなら `3 * 60 * 60` とします。

3

テキスト修正

2018/01/13 02:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -475,3 +475,61 @@
475
475
  ORDER BY DateTime;
476
476
 
477
477
  ```
478
+
479
+
480
+
481
+ ---
482
+
483
+ **追記2**
484
+
485
+
486
+
487
+ 質問に追加されたテーブルの内容から、以下でOKと思います。
488
+
489
+
490
+
491
+ #### 1時間ごと(ちょうどX時 00分)のレコードを検索
492
+
493
+
494
+
495
+ ```sql
496
+
497
+ SELECT * FROM Wind
498
+
499
+ WHERE MINUTE(DateTime) = 0
500
+
501
+ ORDER BY DateTime;
502
+
503
+ ```
504
+
505
+ #### 30分ごと(X時 00分とX時30分)のレコードを検索
506
+
507
+ ```sql
508
+
509
+ SELECT * FROM Wind
510
+
511
+ WHERE MINUTE(DateTime) IN (0, 30)
512
+
513
+ ORDER BY DateTime;
514
+
515
+ ```
516
+
517
+
518
+
519
+ #### 3時間ごと( 17:30 をスタートとして)
520
+
521
+ ```sql
522
+
523
+ SELECT * FROM Wind
524
+
525
+ WHERE
526
+
527
+ MOD(HOUR(DateTime),3) = MOD(17, 3)
528
+
529
+ AND
530
+
531
+ MINUTE(DateTime) = 30
532
+
533
+ ORDER BY DateTime;
534
+
535
+ ```

2

テキスト修正

2018/01/12 11:47

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -440,7 +440,7 @@
440
440
 
441
441
  ```sql
442
442
 
443
- SET @m2 = IF(@m1+30 > 59, @m1 - 30, @m1 + 30);
443
+ SET @m2 = IF(@m1 + 30 > 59, @m1 - 30, @m1 + 30);
444
444
 
445
445
  ```
446
446
 

1

テキスト追記

2018/01/12 00:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -417,3 +417,61 @@
417
417
 
418
418
 
419
419
  以上、参考になれば幸いです。
420
+
421
+
422
+
423
+ ----
424
+
425
+ 追記
426
+
427
+
428
+
429
+ 上記の、変数を使った SQL は以下のようにリファクタできます。
430
+
431
+   
432
+
433
+ **30分おき:**
434
+
435
+
436
+
437
+ `@m1` から `@m2` を作るところは、以下の1行で済みます。
438
+
439
+
440
+
441
+ ```sql
442
+
443
+ SET @m2 = IF(@m1+30 > 59, @m1 - 30, @m1 + 30);
444
+
445
+ ```
446
+
447
+  
448
+
449
+  
450
+
451
+ **3時間おき:**
452
+
453
+
454
+
455
+ 以下のようにすれば、変数は 1 つだけで済みます。
456
+
457
+
458
+
459
+ ```sql
460
+
461
+ SET @datetime = (SELECT DateTime FROM Wind ORDER BY DateTime LIMIT 1);
462
+
463
+
464
+
465
+ SELECT * FROM Wind
466
+
467
+ WHERE
468
+
469
+ MOD(HOUR(DateTime),3) = MOD(HOUR(@datetime),3)
470
+
471
+ AND
472
+
473
+ MINUTE(DateTime) = MINUTE(@datetime)
474
+
475
+ ORDER BY DateTime;
476
+
477
+ ```