JavaとMySQLで日時のデータを扱うにはJava側はLocalDateTime型、MySQL側はDATETIME型にするのが最も良いでしょう。

MySQLのDATETIME型

MySQLで以下のようなテーブルを作成したとします。

DATETIME型を使用したテーブル

Default/Expressionで「CURRENT_TIMESTAMP」とすると、INSERT文を実行した時の日時が、「CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」とするとUPDATE文を実行した日時がそれぞれ記録されます。

INSERT文と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_testテーブル内のDATETIMEカラムを指定したフォーマットに変換する例です。

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つの日時の差分を計算することができます。以下は、datetime_testテーブル内の2つのDATETIMEカラム間の時間差を計算する例です。

SELECT TIMESTAMPDIFF(SECOND, created_at, updated_at) AS second_diff FROM datetime_test;

上記の例では、created_atupdated_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オブジェクトを取得します。

最後に、保存された日時を表示しています。

最後までお読みいただきありがとうございます。