mysql で利用可能な誕生日のタイプ: 1. DATE タイプ、表現できる日付形式は「YYYY-MM-DD」で、保存に 3 バイトが必要です; 2. DATETIME タイプ、日付形式は表現できる日付形式は「YYYY-MM-DD HH:MM:SS」で、格納時に8バイト必要です; 3. TIMESTAMP型、表現できる日付形式は「YYYY-MM-DD HH:MM:SS」です、保存時は4バイト必要です。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
MySQL の誕生日に適した日付と時刻のタイプ
タイプ名 | 日付形式 | 日付範囲 | ストレージ要件 |
---|---|---|---|
DATE | YYYY-MM-DD | 1000- 01-01 ~ 9999-12-3 | 3 バイト |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 バイト |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | 4 バイト |
DATE 型
DATE 型は、時刻部分を除いて日付値のみが必要な場合に使用され、格納に 3 バイトが必要です。日付形式は「YYYY-MM-DD」です。YYYY は年、MM は月、DD は日を表します。
DATE 型フィールドに値を割り当てる場合、DATE の日付形式に準拠していれば、文字列型または数値型のデータを挿入できます。以下に示すように:
「YYYY-MM-DD」または「YYYYMMDD」文字の形式で表される日付。値の範囲は「1000-01-01」~「9999」です。 - 12-3'。たとえば、「2015-12-31」または「20151231」と入力すると、データベースに挿入される日付は 2015-12-31 になります。
日付を「YY-MM-DD」または「YYMMDD」文字列形式で表します。YY は 2 桁の年の値を表します。 MySQL は 2 桁の年の値のルールを解釈します。「00 ~ 69」の範囲の年の値は「2000 ~ 2069」に変換され、「70 ~ 99」の範囲の年の値は「2000 ~ 2069」に変換されます。 「1970年〜1999年」。たとえば、「15-12-31」と入力すると、データベースに挿入される日付は 2015-12-31 になり、「991231」と入力すると、データベースに挿入される日付は 1999-12-31 になります。
YYMMDD 数値形式で表現された日付は前と同様で、00 ~ 69 の範囲の年の値は 2000 ~ 2069 に変換され、年の値は 2000 ~ 2069 に変換されます。 80~99の範囲は1980~1999に変換されます。たとえば、「151231」と入力すると、データベースに挿入される日付は 2015-12-31 になり、「991231」と入力すると、データベースに挿入される日付は 1999-12-31 になります。
現在のシステム日付を挿入するには、CURRENT_DATE または NOW() を使用します。
ヒント: MySQL では「緩和された」構文が許可されています。任意の句読点を日付部分間の区切り文字として使用できます。たとえば、「98-11-31」、「98.11.31」、「98/11/31」、および「98@11@31」は同等であり、これらの値はデータベースに正しく挿入されます。
DATETIME 型
DATETIME 型は、日付と時刻の情報の両方を含む必要があり、格納に 8 バイトを必要とする値に使用されます。日付形式は「YYYY-MM-DD HH:MM:SS」です。ここで、YYYY は年、MM は月、DD は日、HH は時、MM は分、SS は秒を表します。
##DATETIME 型のフィールドに値を割り当てる場合、以下に示すように、DATETIME の日付形式に準拠している限り、文字列型または数値型のデータを挿入できます。 #「YYYY-MM-DD HH:MM:SS」または「YYYYMMDDHHMMSS」の文字列形式で表される日付。値の範囲は「1000-01-01 00:00:00」~」です。 9999-12-3 23:59:59」。たとえば、「2014-12-31 05:05:05」または「20141231050505」と入力すると、データベースに挿入される DATETIME 値は 2014-12-31 05:05:05 になります。TIMESTAMP型
TIMESTAMPの表示形式はDATETIMEと同じで、表示幅は19文字固定、日付形式はYYYYです。 MM-DD HH:MM : SS、ストレージに 4 バイトが必要です。ただし、TIMESTAMP カラムの値の範囲は、DATETIME の値の範囲である '1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07'UTC よりも小さくなります。データを挿入するときは、それが正当な値の範囲内であることを確認してください。
ヒント: 協定世界時 (英語: Coowned Universal Time、フランス語: Temps Universel Coordonné) は、世界統一時、世界標準時、および国際協定時とも呼ばれます。英語 (CUT) とフランス語 (TUC) の略称は異なるため、妥協案として略称は UTC になります。
DATETIME 日付データを保存する場合、次に従って保存されます。つまり、タイム ゾーンに関係なく、入力された内容はすべて保存されます。TIMESTAMP と DATETIME、ストレージ バイトとサポートされる範囲の違いに加えて、最大の違いは次のとおりです。
ヒント: DATE 値を DATETIME または TIMESTAMP オブジェクトに割り当てると、結果の値の時刻部分が '00:00:00' に設定されるため、DATE 値は時間情報は含まれていません。 DATE オブジェクトに DATETIME または TIMESTAMP 値が割り当てられている場合、結果の値の時刻部分が削除されるため、DATE 値には時刻情報が含まれません。
#時刻と日付の関数
上の図は、sysdate() によって返される時刻が now() の current_timestamp とは異なり、2 秒遅いことを示しています。その理由は次のとおりです。
① date_add および date_sub
select date_add('2017-12-18 22:51:00', interval 1 second), date_add('2017-12-18 22:51:00', interval 1 minute), date_add('2017-12-18 22:51:00', interval 1 hour), date_add('2017-12-18 22:51:00', interval 1 day), date_add('2017-12-18 22:51:00', interval 1 month), date_add('2017-12-18 22:51:00', interval 1 year);
select date_add('2016-02-29 22:51:00', interval -1 year), date_add('2016-02-29 22:51:00', interval 4 year);
2015-02-28 22:51:002020-02-29 22:51:00
timediff(time1,time2):two 減算各日付から time1 - time2 を計算し、時差を返します (形式: 838:59:59)。 select timediff('2016-02-29 22:51:00','2016-01-29 22:51:00');
注: timediff(time1,time2)関数の 2 つのパラメーターは同じ型である必要があります。
-- 日付時刻
-- date_add と同様, 単位ごとに時間を増やしたり減らしたりします。
select timestampadd(second, 60, '2017-12-18 00:00:00'); select timestampadd(minute, 60, '2017-12-18 00:00:00'); select timestampadd(hour, 60, '2017-12-18 00:00:00');
--2 つの時間の差を計算します。 , 秒、分、時、日、月、年、週を計算できます
select timestampdiff(second, '2017-12-18 00:00:00','2017-12-18 12:00:00'); select timestampdiff(hour, '2017-11-18 00:00:00','2017-12-18 12:00:00'); select timestampdiff(day, '2017-10-17 00:00:00','2017-11-18 23:00:00');
date_format 関数は主に日付の書式設定に使用されます
select date_format(now(),'%Y%m%d'), date_format(now(),'%Y-%m-%d'), date_format(now(),'%Y/%m/%d'), date_format(now(),'%m/%d/%Y');
注: データのクエリ時に日付フィールドにこの関数を使用すると、オプティマイザーはフィールドのインデックスを使用せず、インデックスを介してデータをクエリすることもできないため、クエリ効率が非常に低くなります。 、次のクエリ ステートメントでは、フィールドbirth_date インデックスがある場合、date_format 関数の使用によりインデックスは無効になります:
select * from employees where date_format(birth_date,'%Y-%m-%d') = '1961-08-03';
日付に関する従来のプログラミングの問題ユーザーの生年月日に応じて、現在の日付を使用して、最新の誕生日 (過去および将来の誕生日を含む) を計算します。
-- 上一年,当年,下一年生日与当前时间差最小的年就是用户最近的生日 select emp_no,first_name,last_name,birth_date,today,if(last_diff<=cur_diff and last_diff<=next_diff, last,if(cur_diff from ( -- 计算当前时间与上一年,当年,下一年生日的时间差 select emp_no,first_name,last_name,birth_date,datediff(today,last) as last_diff,abs(datediff(today,cur)) as cur_diff,abs(datediff(today,next)) as next_diff, last,cur,next,today from ( -- 用户最近的生日可能分布在前一年,当年,下一年。根据年度差year_diff计算上一年,当年,下一年用户的生日 select emp_no,first_name,last_name,birth_date, DATE_ADD(birth_date,INTERVAL year_diff year) as cur, DATE_ADD(birth_date,INTERVAL year_diff+1 year) as next, DATE_ADD(birth_date,INTERVAL year_diff-1 year) as last, today from ( -- 获取当前事前与出生日期的年度差 year_diff select emp_no,first_name,last_name,birth_date,(year(NOW())-year(birth_date)) as year_diff, NOW() as today from employees ) a ) b ) c
[関連する推奨事項:
mysql ビデオ チュートリアル以上がmysqlの誕生日にはどのような型が使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。