ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL 文字型から日付型への変換①

■文字型でYYYY-MMの形式を日付型へ変換
PostgreSQLの場合

SELECT
    section1,
    section2,
    to_date(month, 'YYYY-MM') as converted_month,
    SUM(amount) as total_amount
FROM
    workexpenses
WHERE
    (section1 = 'C' AND section2 IN ('Z', 'Y', 'X'))
GROUP BY
    section1, section2, converted_month
ORDER BY
    section1, section2, converted_month;

MySQLの場合
STR_TO_DATE関数では、第2引数にフォーマット文字列を指定して、第1引数のテキストを日付型に変換します。上記の例では、'%Y-%m'というフォーマットを使用していますが、これは「2022-04」のような形式のテキストを日付型に変換するためのものです

SELECT
    section1,
    section2,
    STR_TO_DATE(month, '%Y-%m') as converted_month,
    SUM(amount) as total_amount
FROM
    workexpenses
WHERE
    (section1 = 'C' AND section2 IN ('Z', 'Y', 'X'))
GROUP BY
    section1, section2, STR_TO_DATE(month, '%Y-%m')
ORDER BY
    section1, section2, STR_TO_DATE(month, '%Y-%m');

【テストデータ作成用SQL

-- テーブルの作成
CREATE TABLE WorkExpenses (
    no INT PRIMARY KEY,
    section1 CHAR(1),
    section2 CHAR(1),
    month VARCHAR(10),  -- この例ではテキスト型としていますが、日付型も考慮します
    amount DECIMAL(10, 2)
);

-- テストデータの挿入
INSERT INTO WorkExpenses(no, section1, section2, month, amount) VALUES
(1, 'C', 'Z', '2022-01', 100.50),
(2, 'C', 'Y', '2022-01', 150.75),
(3, 'C', 'X', '2022-01', 80.00),
(4, 'C', 'Z', '2022-02', 110.00),
(5, 'C', 'Y', '2022-02', 120.50),
(6, 'C', 'X', '2022-02', 70.25),
(7, 'C', 'Z', '2022-03', 105.50),
(8, 'C', 'Y', '2022-03', 140.25),
(9, 'C', 'X', '2022-03', 75.75),
(10, 'C', 'Z', '2022-04', 115.00),
(11, 'A', 'B', '2022-01', 50.50),  -- これらは特定の作業コードの組み合わせ以外のデータです
(12, 'A', 'B', '2022-02', 55.25),
(13, 'A', 'B', '2022-03', 60.00),
(14, 'A', 'B', '2022-04', 65.75);