JavaとMySQLで日時のデータを扱うにはJava側はLocalDateTime型、MySQL側はDATETIME型にするのが最も良いでしょう。
MySQLのDATETIME型
MySQLで以下のようなテーブルを作成したとします。
Default/Expressionで「CURRENT_TIMESTAMP」とすると、INSERT文を実行した時の日時が、「CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」とするとUPDATE文を実行した日時がそれぞれ記録されます。
MySQLのDATETIME
型
MySQLのDATETIME
は、日付と時刻の両方を格納するために使用されるデータ型です。DATETIME
は、年、月、日、時、分、秒の情報を保持することができます。以下にDATETIME
に関する詳細を説明します。
DATETIME
の基本
データ範囲
DATETIME
は、1000年から9999年の間の日付と時刻をサポートしています。ただし、MySQLのバージョンによっては、範囲が異なる場合があります。また、MySQLのタイムゾーン設定に基づいてデータが格納されます。
表現形式
DATETIME
の表現形式は、'YYYY-MM-DD HH:MM:SS'
です。年は4桁で、月、日、時、分、秒は2桁で表現されます。例えば、2023年6月11日15時30分45秒は、'2023-06-11 15:30:45'
となります。
デフォルト値
DATETIME
カラムにデフォルト値として「CURRENT_TIMESTAMP」を指定することができます。このデフォルト値は、新しい行が挿入されたときに自動的に現在の日時が設定されます。
自動更新
DATETIME
カラムにデフォルト値として「CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」を指定することができます。このデフォルト値は、新しい行が挿入されたり既存の行が更新されたときに自動的に現在の日時が更新されます。
CREATE TABLE datetime_test (
id INT PRIMARY KEY AUTO_INCREMENT,
post VARCHAR(4000),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
DATETIMEデータ型を使った日付と時刻の処理
日時の比較
DATETIME
カラムの値を比較することができます。以下は、datetime_test
テーブル内のcreated_atカラムが'2023-06-13 04:50:50'より後のレコードを抽出します。
SELECT * FROM datetime_test WHERE created_at > '2023-06-13 04:50:50';
上記の例では、created_at
カラムの値が指定した日時よりも後の行を取得します。
<実行結果の例>
'2', 'こんばんは。', '2023-06-13 04:51:06', '2023-06-13 04:51:06' |
日時の演算
DATETIME
カラムの値に対して算術演算や日時の加減算を行うことができます。以下は、
テーブル内のdatetime_test
DATETIME
カラム(updated_at)全てに対して1時間を加算する例です。
UPDATE datetime_test SET updated_at = updated_at + INTERVAL 1 HOUR;
上記の例では、updated_at
カラムの値に1時間を加算して更新します。
<実行結果の例>
'1', 'Hello world', '2023-06-13 04:50:48', '2023-06-13 05:51:26' '2', 'こんばんは。', '2023-06-13 04:51:06', '2023-06-13 05:51:06' |
DATETIMEの関数
日時のフォーマット
DATETIMEカラムの値を特定のフォーマットに変換することができます。DATE_FORMAT関数を使用して日時を指定したフォーマットに変換することができます。以下は、
テーブル内のDATETIMEカラムを指定したフォーマットに変換する例です。datetime_test
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H') AS formatted_datetime FROM datetime_test;
上記の例では、created_at
カラムの値を'YYYY-MM-DD HH'
のフォーマットで取得します。
<実行結果の例>
'2023-06-13 04' '2023-06-13 04' |
日時の差分
DATETIME
カラム間の日時の差分を計算することができます。TIMESTAMPDIFF
関数を使用して、指定した時間単位で2つの日時の差分を計算することができます。以下は、
テーブル内の2つのdatetime_test
DATETIME
カラム間の時間差を計算する例です。
SELECT TIMESTAMPDIFF(SECOND, created_at, updated_at) AS second_diff FROM datetime_test;
上記の例では、created_at
とupdated_at
カラム間の時間差を時間単位で取得します。
<実行結果の例>
'3638' '3600' |
現在の日時を取得
NOW()関数は、現在の日時(年月日と時刻)を返します。タイムゾーンに従って返されます。
SELECT now();
<実行結果の例>
'2023-06-13 10:57:27' |
日時の加算
DATE_ADD(date, INTERVAL expr unit)関数は、指定された日時に対して、exprで指定した数値と単位(unit)を加算します。例えば、以下はdatetime_testテーブル内のcreated_atカラムの全ての時間を1日進めた結果を返します。
SELECT date_add(created_at, INTERVAL 1 DAY) from datetime_test;
<実行結果の例>
'2023-06-14 04:50:48' '2023-06-14 04:51:06' '2023-06-14 05:30:01' |
日時の減算
DATE_SUB(date, INTERVAL expr unit):
DATE_SUB()関数は、指定された日時に対して、exprで指定した数値と単位(unit)を減算します。例えば、以下はdatetime_testテーブル内のcreated_atカラムの全ての時間を1日戻した結果を返します。
SELECT date_sub(created_at, INTERVAL 1 DAY) from datetime_test;
<実行結果の例>
'2023-06-12 04:50:48' '2023-06-12 04:51:06' '2023-06-12 05:30:01' |
日付の取得
DATE():
DATE()関数は、指定された日時から時刻を切り捨て、日付の部分だけを返します。例えば、以下はdatetime_testテーブル内のcreated_atカラムの全ての日時から日付の部分だけの結果を返します。
SELECT date(created_at) from datetime_test;
<実行結果の例>
'2023-06-13' '2023-06-13' '2023-06-13' |
時間の取得
TIME()関数は、指定された日時から日付を切り捨て、時間の部分だけを返します。例えば、以下はdatetime_testテーブル内のcreated_atカラムの全ての日時から時間の部分だけの結果を返します。
SELECT time(created_at) from datetime_test;
<実行結果の例>
'04:50:48' '04:51:06' '05:30:01' |
JavaからMySQLのDATETIME型を扱う
saveDateTime
メソッドでは、引数として渡されたを"おはようございます。"というオブジェクトをデータベースに保存します。INSERT INTO
クエリを使用し、post列に値をセットして実行します。
getDateTime
メソッドでは、データベースから最新の日時データを取得します。SELECT
クエリを使用し、datetime_test
テーブルからcreated_at列を取得します。executeQuery
メソッドを使用してクエリを実行し、ResultSet
を取得します。結果セットにデータが存在する場合、getObject
メソッドを使用してLocalDateTime
オブジェクトを取得します。
最後に、保存された日時を表示しています。