UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#042 MySQL INTERVALを使って日時の計算

記入日:2023-02-19 編集日:2023-02-19

SQL見るだけクエリ。今回はINTERVALを使って、日時のカラムを計算する方法を考えてみようと思います。

この記事を読むと(約5分)
日時カラムに時間を増減させて計算する方法がわかります。

INTERVALの基本的な使い方は以下になります。
 +(-) INTERVAL 数値 単位

INTERVALに、DATE_ADDもしくはDATE_SUBを組み合わせて値を取得できます。
 DATE_ADD ---日付を加算する
 DATE_SUB ---日付を減算する

加減算する単位は以下の単位を指定できます。
 MONTH
 WEEK
 DAY
 HOUR
 MINUTE
 SECOND
 MICROSECOND

// 指定した日付の1週間後を取得する
SELECT DATE_ADD('2023/02/19', INTERVAL 1 WEEK);
--------------------------------------
2023-02-26

// 指定した日付の2週間前を取得する
SELECT DATE_SUB('2023/02/19',INTERVAL 2 WEEK);
--------------------------------------
2023-02-05

// DATE_ADD 関数でマイナスの値を指定しても減算することができます。
SELECT DATE_ADD('2023/02/19',INTERVAL -2 WEEK);
--------------------------------------
2023-02-05

SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY); 
--------------------------------------
明日

SELECT DATE_ADD(CURRENT_DATE, INTERVAL 2 DAY); 
--------------------------------------
あさって

SELECT DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY);
--------------------------------------
昨日

SELECT DATE_SUB(CURRENT_DATE, INTERVAL 2 DAY);
--------------------------------------
おととい
 

以下のsql_orderテーブルには、注文商品ごとにレコードがインサートされています。

datetimeの日付に、1ヶ月を追加したカラムを追加してみようと思います。

テーブル名:sql_order

                    
idorder_idnameitem_idpricequantitysizedatetimestatus
11伊藤 明日香sku-000130001S2022-12-16 07:00:001
21伊藤 明日香sku-000225003S2022-12-16 07:00:001
31伊藤 明日香sku-000390001S2022-12-16 07:00:001
42原田 和美sku-000130001L2022-12-16 10:00:001
52原田 和美sku-000225001L2022-12-16 10:00:001
62原田 和美sku-000390002L2022-12-16 10:00:001
73高橋 由美子sku-000130001M2022-12-16 18:00:001
83高橋 由美子sku-000225005S2022-12-16 18:00:001
93高橋 由美子sku-000390001M2022-12-16 18:00:001
104田中 明日香sku-000130001S2022-12-16 22:00:001
114田中 明日香sku-000225001S2022-12-16 22:00:001
124田中 明日香sku-000390002S2022-12-16 22:00:001
135小林 美佐子sku-000130001L2022-12-17 10:00:001
145小林 美佐子sku-000225001L2022-12-17 10:00:001
155小林 美佐子sku-000390002L2022-12-17 10:00:001
166渡辺 雄一sku-000130001S2022-12-18 08:00:001
176渡辺 雄一sku-000225001S2022-12-18 08:00:001
186渡辺 雄一sku-000390001S2022-12-18 08:00:001
197佐藤 智子sku-0001300012M2022-12-18 15:00:001
207佐藤 智子sku-000225001S2022-12-18 15:00:001
217佐藤 智子sku-000390001M2022-12-18 15:00:001
228坂本 純子sku-000130001S2022-12-19 20:00:001
238坂本 純子sku-000225001S2022-12-19 20:00:001
248坂本 純子sku-000390003S2022-12-19 20:00:001
259加藤 和子sku-000130001L2022-12-20 10:00:001
269加藤 和子sku-000225008L2022-12-20 10:00:001
279加藤 和子sku-000390001L2022-12-20 10:00:001
2810山口 晴子sku-000130001M2022-12-20 19:00:001
2910山口 晴子sku-000225001L2022-12-20 19:00:001
3010山口 晴子sku-000390003L2022-12-20 19:00:001

さていつもの様に、テーブルの情報を取得するSQLに関して、注目する部分は、以下の9~11行目のみです。

SELECT id, name, datetime,
DATE_ADD(datetime, INTERVAL 1 MONTH) AS add_time
FROM sql_order

DATE_ADD(datetime, INTERVAL 1 MONTH)

この部分でdatetimeカラムの、1ヶ月後を計算し取得しております。


try {
    include_once '../model/class.php';

    // データベース接続
    $database = new Database();
    $db = $database->connect();

    // SQLを準備し、パラメータをバインドする
    $query = 'SELECT id, name, datetime, 
    DATE_ADD(datetime, INTERVAL 1 MONTH) AS add_time 
    FROM sql_order';

    $stmt = $db->prepare($query);

    // 実行する
    $stmt->execute();

    // 結果を取得する
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

    // データベースから切断する
    $database->disconnect();

} catch(PDOException $e) {
    echo $e->getMessage();
}

これを実行すると、二次元連想配列で、取得することができます。

            Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 伊藤 明日香
            [datetime] => 2022-12-16 07:00:00
            [add_time] => 2023-01-16 07:00:00
        )

    [1] => Array
        (
            [id] => 2
            [name] => 伊藤 明日香
            [datetime] => 2022-12-16 07:00:00
            [add_time] => 2023-01-16 07:00:00
        )

    [2] => Array
        (
            [id] => 3
            [name] => 伊藤 明日香
            [datetime] => 2022-12-16 07:00:00
            [add_time] => 2023-01-16 07:00:00
        )

    [3] => Array
        (
            [id] => 4
            [name] => 原田 和美
            [datetime] => 2022-12-16 10:00:00
            [add_time] => 2023-01-16 10:00:00
        )

    [4] => Array
        (
            [id] => 5
            [name] => 原田 和美
            [datetime] => 2022-12-16 10:00:00
            [add_time] => 2023-01-16 10:00:00
        )

    [5] => Array
        (
            [id] => 6
            [name] => 原田 和美
            [datetime] => 2022-12-16 10:00:00
            [add_time] => 2023-01-16 10:00:00
        )

    [6] => Array
        (
            [id] => 7
            [name] => 高橋 由美子
            [datetime] => 2022-12-16 18:00:00
            [add_time] => 2023-01-16 18:00:00
        )

    [7] => Array
        (
            [id] => 8
            [name] => 高橋 由美子
            [datetime] => 2022-12-16 18:00:00
            [add_time] => 2023-01-16 18:00:00
        )

    [8] => Array
        (
            [id] => 9
            [name] => 高橋 由美子
            [datetime] => 2022-12-16 18:00:00
            [add_time] => 2023-01-16 18:00:00
        )

    [9] => Array
        (
            [id] => 10
            [name] => 田中 明日香
            [datetime] => 2022-12-16 22:00:00
            [add_time] => 2023-01-16 22:00:00
        )

    [10] => Array
        (
            [id] => 11
            [name] => 田中 明日香
            [datetime] => 2022-12-16 22:00:00
            [add_time] => 2023-01-16 22:00:00
        )

    [11] => Array
        (
            [id] => 12
            [name] => 田中 明日香
            [datetime] => 2022-12-16 22:00:00
            [add_time] => 2023-01-16 22:00:00
        )

    [12] => Array
        (
            [id] => 13
            [name] => 小林 美佐子
            [datetime] => 2022-12-17 10:00:00
            [add_time] => 2023-01-17 10:00:00
        )

    [13] => Array
        (
            [id] => 14
            [name] => 小林 美佐子
            [datetime] => 2022-12-17 10:00:00
            [add_time] => 2023-01-17 10:00:00
        )

    [14] => Array
        (
            [id] => 15
            [name] => 小林 美佐子
            [datetime] => 2022-12-17 10:00:00
            [add_time] => 2023-01-17 10:00:00
        )

    [15] => Array
        (
            [id] => 16
            [name] => 渡辺 雄一
            [datetime] => 2022-12-18 08:00:00
            [add_time] => 2023-01-18 08:00:00
        )

    [16] => Array
        (
            [id] => 17
            [name] => 渡辺 雄一
            [datetime] => 2022-12-18 08:00:00
            [add_time] => 2023-01-18 08:00:00
        )

    [17] => Array
        (
            [id] => 18
            [name] => 渡辺 雄一
            [datetime] => 2022-12-18 08:00:00
            [add_time] => 2023-01-18 08:00:00
        )

    [18] => Array
        (
            [id] => 19
            [name] => 佐藤 智子
            [datetime] => 2022-12-18 15:00:00
            [add_time] => 2023-01-18 15:00:00
        )

    [19] => Array
        (
            [id] => 20
            [name] => 佐藤 智子
            [datetime] => 2022-12-18 15:00:00
            [add_time] => 2023-01-18 15:00:00
        )

    [20] => Array
        (
            [id] => 21
            [name] => 佐藤 智子
            [datetime] => 2022-12-18 15:00:00
            [add_time] => 2023-01-18 15:00:00
        )

    [21] => Array
        (
            [id] => 22
            [name] => 坂本 純子
            [datetime] => 2022-12-19 20:00:00
            [add_time] => 2023-01-19 20:00:00
        )

    [22] => Array
        (
            [id] => 23
            [name] => 坂本 純子
            [datetime] => 2022-12-19 20:00:00
            [add_time] => 2023-01-19 20:00:00
        )

    [23] => Array
        (
            [id] => 24
            [name] => 坂本 純子
            [datetime] => 2022-12-19 20:00:00
            [add_time] => 2023-01-19 20:00:00
        )

    [24] => Array
        (
            [id] => 25
            [name] => 加藤 和子
            [datetime] => 2022-12-20 10:00:00
            [add_time] => 2023-01-20 10:00:00
        )

    [25] => Array
        (
            [id] => 26
            [name] => 加藤 和子
            [datetime] => 2022-12-20 10:00:00
            [add_time] => 2023-01-20 10:00:00
        )

    [26] => Array
        (
            [id] => 27
            [name] => 加藤 和子
            [datetime] => 2022-12-20 10:00:00
            [add_time] => 2023-01-20 10:00:00
        )

    [27] => Array
        (
            [id] => 28
            [name] => 山口 晴子
            [datetime] => 2022-12-20 19:00:00
            [add_time] => 2023-01-20 19:00:00
        )

    [28] => Array
        (
            [id] => 29
            [name] => 山口 晴子
            [datetime] => 2022-12-20 19:00:00
            [add_time] => 2023-01-20 19:00:00
        )

    [29] => Array
        (
            [id] => 30
            [name] => 山口 晴子
            [datetime] => 2022-12-20 19:00:00
            [add_time] => 2023-01-20 19:00:00
        )

)
			

datetimeカラムの、1ヶ月後を計算し取得

id name datetime add_time
1
伊藤 明日香
2022-12-16 07:00:00
2023-01-16 07:00:00
2
伊藤 明日香
2022-12-16 07:00:00
2023-01-16 07:00:00
3
伊藤 明日香
2022-12-16 07:00:00
2023-01-16 07:00:00
4
原田 和美
2022-12-16 10:00:00
2023-01-16 10:00:00
5
原田 和美
2022-12-16 10:00:00
2023-01-16 10:00:00
6
原田 和美
2022-12-16 10:00:00
2023-01-16 10:00:00
7
高橋 由美子
2022-12-16 18:00:00
2023-01-16 18:00:00
8
高橋 由美子
2022-12-16 18:00:00
2023-01-16 18:00:00
9
高橋 由美子
2022-12-16 18:00:00
2023-01-16 18:00:00
10
田中 明日香
2022-12-16 22:00:00
2023-01-16 22:00:00
11
田中 明日香
2022-12-16 22:00:00
2023-01-16 22:00:00
12
田中 明日香
2022-12-16 22:00:00
2023-01-16 22:00:00
13
小林 美佐子
2022-12-17 10:00:00
2023-01-17 10:00:00
14
小林 美佐子
2022-12-17 10:00:00
2023-01-17 10:00:00
15
小林 美佐子
2022-12-17 10:00:00
2023-01-17 10:00:00
16
渡辺 雄一
2022-12-18 08:00:00
2023-01-18 08:00:00
17
渡辺 雄一
2022-12-18 08:00:00
2023-01-18 08:00:00
18
渡辺 雄一
2022-12-18 08:00:00
2023-01-18 08:00:00
19
佐藤 智子
2022-12-18 15:00:00
2023-01-18 15:00:00
20
佐藤 智子
2022-12-18 15:00:00
2023-01-18 15:00:00
21
佐藤 智子
2022-12-18 15:00:00
2023-01-18 15:00:00
22
坂本 純子
2022-12-19 20:00:00
2023-01-19 20:00:00
23
坂本 純子
2022-12-19 20:00:00
2023-01-19 20:00:00
24
坂本 純子
2022-12-19 20:00:00
2023-01-19 20:00:00
25
加藤 和子
2022-12-20 10:00:00
2023-01-20 10:00:00
26
加藤 和子
2022-12-20 10:00:00
2023-01-20 10:00:00
27
加藤 和子
2022-12-20 10:00:00
2023-01-20 10:00:00
28
山口 晴子
2022-12-20 19:00:00
2023-01-20 19:00:00
29
山口 晴子
2022-12-20 19:00:00
2023-01-20 19:00:00
30
山口 晴子
2022-12-20 19:00:00
2023-01-20 19:00:00

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。