MySQLで日付と時刻を効果的に操作する方法

MySQLで日付と時刻を効果的に操作する方法

日付と時刻は重要であり、物事を整理するのに役立ち、ソフトウェア操作の不可欠な側面です。





データベース内でそれらを効率的に操作することは、さまざまなタイムゾーンで機能しているかどうか、日付の加算/減算、およびその他の操作であるかどうかにかかわらず、混乱するように見えることがあります。





データベース内の日付/時刻を簡単に処理および管理するために使用できるさまざまなMySQL関数について学習します。





タイムゾーンの操作

物事を標準化するために、UTCタイムゾーンの日付/時刻のみを操作する必要があります。 MySQLデータベースへの接続を確立するたびに、タイムゾーンをUTCに切り替える必要があります。これは、次のSQLステートメントで実行できます。

SET TIME_ZONE = '+0:00'

すべての日付がUTCで保存されるようになったため、作業内容が常にわかり、作業がより単純でわかりやすくなります。



コンピューターからコンピューターにデータを転送する方法

必要に応じて簡単にできます タイムゾーンを変換する 便利な日時/タイムスタンプ値の CONVERT_TZ() MySQL関数。最初にオフセットを知る必要があります。たとえば、北米の西海岸のPSTはUTC -08:00なので、次を使用できます。

SELECT CONVERT_TZ('2021-02-04 21:47:23', '+0:00', '-8:00');

これにより、 2021-02-04 13:47:23 これは正確に正しいです。に渡された3つの引数 CONVERT_TZ() 最初は開始する日時/タイムスタンプ(現在の時刻にはnow()を使用)であり、2番目は常に '+0:00' データベースではすべての日付がUTCに強制され、最後が日付を変換するオフセットであるためです。





日付の加算/減算

1週間前のレコードを取得する必要がある場合や、1か月後に何かをスケジュールする必要がある場合など、多くの場合、日付を加算または減算する必要があります。

ありがたいことに、MySQLには優れた機能があります DATE_ADD()DATE_SUB() このタスクを非常に簡単にする機能。たとえば、SQLステートメントを使用して現在の日付から2週間を引くことができます。





SELECT DATE_SUB(now(), interval 2 week);

代わりに、既存のタイムスタンプに3日を追加する場合は、次を使用します。

SELECT DATE_ADD('2021-02-07 11:52:06', interval 3 day);

どちらの関数も同じように機能し、最初の引数は開始するタイムスタンプであり、2番目の引数は加算または減算する間隔です。 2番目の引数は、単語で始まる常に同じ形式になります 間隔 その後に数値と間隔自体が続きます。これは、秒、分、時間、日、週、月、四半期、年のいずれかになります。

別の例として、過去34分間に発生したすべてのログインを取得する場合は、次のようなSQLステートメントを使用できます。

SELECT * FROM logins WHERE login_date >= DATE_SUB(now(), interval 45 minute);

ご覧のとおり、これにより、からすべてのレコードが取得されます。 ログイン ログイン日付が現在の時刻から45分を引いた値、つまり過去45分よりも大きいテーブル。

日付の違いを取得する

2つの日付の間に経過した時間を取得する必要がある場合があります。あなたは簡単に2つの異なる日付の間の日数を得ることができます DATEDIFF 以下のSQLステートメントなどの関数:

SELECT DATEDIFF(now(), '2020-12-15');

NS DATEDIFF 関数は2つの引数を取ります。どちらも日付/タイムスタンプであり、それらの間の日数を示します。上記の例は、2020年12月15日から今日までの経過日数を示しています。

2つの日付の間の秒数を取得するには、 TO_SECONDS() 関数は次のように役立ちます。

SELECT TO_SECONDS(now()) - TO_SECONDS('2021-02-05 11:56:41');

これにより、指定された2つの日付の間の秒数が得られます。

日付からセグメントを抽出

月、日、または時間のみが必要な場合など、日付から特定のセグメントを簡単に抽出できるさまざまなMySQL関数があります。このような関数の例をいくつか示します。

SELECT MONTH('2021-02-11 15:27:52'); SELECT HOUR(now()); SELECT DAYOFYEAR('2021-07-15 12:00:00');

上記のSQLステートメントは次のようになります 02 、現在の時間、および 196 9月15日はその年の196日目です。使用可能なすべての日付抽出関数のリストを次に示します。それぞれが1つの引数のみを取り、日付は次の場所から抽出されます。

- SECOND()
- MINUTE()
- HOUR()
- DAY()
- WEEK() - Number 0 - 52 defining the week within the year.
- MONTH()
- QUARTER() - Number 1 - 4 defining the quarter of the year.
- YEAR()
- DAYOFYEAR() - The day of the year (eg. Sept 15th = 196).
- LAST_DAY() - The last day in the given month.
- DATE() - The date in YYYY-MM-DD format without the time.
- TIME() The time in HH:II:SS format without the date.
- TO_DAYS() - The number of days since A.D. 0.
- TO_SECONDS() - The number of seconds since A.D. 0.
- UNIX_TIMESTAMP() - The number of seconds since the epoch (Jan 1st, 1970)

たとえば、すべてのユーザーが作成された月と年のみを取得したい場合は、次のようなSQLステートメントを使用できます。

SELECT id, MONTH(created_at), YEAR(created_at) FROM users;

これにより、内のすべてのレコードが取得されます ユーザー 表を作成し、各ユーザーが作成されたID番号、月、年を表示します。

期間によるレコードのグループ化

日付関数の優れた使用法の1つは、を使用して日付期間ごとにレコードをグループ化する機能です。 GROUP BY SQLステートメント内。たとえば、2020年のすべての注文の合計金額を月ごとにグループ化して取得したい場合があります。次のようなSQLステートメントを使用できます。

SELECT MONTH(created_at), SUM(amount) FROM orders WHERE created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59' GROUP BY MONTH(created_at);

これにより、2020年に行われたすべての注文が取得され、作成された月ごとにグループ化され、その年の各月に注文された合計金額を示す12レコードが返されます。

インデックスのパフォーマンスを向上させるには、次のような日付関数の使用を避けることが常に最善であることに注意してください。 年() SQLステートメントのWHERE句内で、代わりに の間に 上記の例に示されている演算子。

二度と日付と混同しないでください

上記の知識を使用すると、さまざまなユースケースで日付と時刻の操作を効率的に処理、変換、実行できるようになります。

簡単にするために日付を操作するときは常にUTCを使用することを忘れないでください。簡単な計算を完了する場合でも、日付期間ごとにグループ化されたレポートを簡単に取得する場合でも、上記のヒントを利用してソフトウェア内の日付を効率的に管理してください。

SQLを初めて使用する場合は、必ずこれらを確認してください。 重要なSQLコマンド SQLの使用を改善するのに役立ちます。

共有 共有 つぶやき Eメール MicrosoftWordでプロフェッショナルなレポートとドキュメントを作成する方法

このガイドでは、専門的なレポートの要素を調べ、Microsoft Wordでのドキュメントの構造化、スタイル設定、および完成を確認します。

次を読む
関連トピック 著者について マットディザック(18の記事が公開されました) MattDizakのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください