[前][次][番号順一覧][スレッド一覧]

mysql:10314

From: "Zen Kishimoto" <"Zen Kishimoto" <zen@xxxxxxxxxx>>
Date: Wed, 13 Oct 2004 20:35:22 -0700
Subject: [mysql 10314] 時間関数: 4.1の新しい機能の1つ

http://dev.mysql.com/tech-resources/articles/4.1/time.html

時間関数

これはMySQL4.1の新しい機能のいくつかを説明する
幾つかのシリーズの記事の5回目です。4.1は現在ガンマ
フェーズです。

Trudy Pelzer

時間関数(DATE, TIME, DATETIME, TIMESTAMP )
はMySQL 4.1では大きく変更されました。これはマイクロ秒
とタイムゾーンのサポートを含みます。

この記事では時間の値は以下のどれかです: TIME,
DATETIME, TIMESTAMP. 日の値は以下のいずれかです:
DATE, DATETIME, TIMESTAMP. 日時の値は日または時間の
値のタイプのいずれかです。

幾つかの関数は4.1で機能が拡張されました。

ADDDATE(temporal_expression, number_of_days)
SUBDATE(temporal_expression, number_of_days)

    ADDDATE とSUBDATE は4.1.1から少し変更されたシンタクス
で作動します。変更後も日の値で動作しますが、秒や数字の
引数も取ります。

    2番目の引数は日の値に加算(または減算)する日数です。
通常どちらかの、引数がNULLであれば, ADDDATE とSUBDATEは
NULLを変換します。

mysql> select adddate('2004-10-01',15), subdate('2004-10-01',15);
+--------------------------+--------------------------+
| adddate('2004-10-01',15) | subdate('2004-10-01',15) |
+--------------------------+--------------------------+
| 2004-10-16               | 2004-09-16               |
+--------------------------+--------------------------+
1 row in set (0.20 sec)

DATE_ADD(temporal_expression, INTERVAL interval_expression 
interval_constant)
DATE_SUB(temporal_expression, INTERVAL interval_expression 
interval_constant)
EXTRACT(interval_constant FROM temporal_expression)

    DATE_ADD, DATE_SUBと EXTRACT関数は新たに5つの新しい
時間間隔の定数を取ります。それはDAY_MICROSECOND,
HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND,
とMICROSECONDです。

mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
INTERVAL '1.999999' SECOND_MICROSECOND);
+--------------------------------------------------------------------------------+
| DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1.999999' 
SECOND_MICROSECOND) |
+--------------------------------------------------------------------------------+
| 1993-01-01 00:00:01.000001 
|
+--------------------------------------------------------------------------------+
1 row in set (0.02 sec)

DATE_FORMAT(temporal_expression, format_string)
TIME_FORMAT(time_expression, format_string)

    DATE_FORMATとTIME_FORMAT 関数は4.1.1では新たな
オプションもとります。フォーマットのストリング
に %fをつかうと、000000 から999999 の間でミリセカンド
のオーダで結果を返します。

mysql> select date_format(current_timestamp,'%f');
+-------------------------------------+
| date_format(current_timestamp,'%f') |
+-------------------------------------+
| 000000                              |
+-------------------------------------+
1 row in set (0.02 sec)

mysql> select time_format(current_time,'%f');
+--------------------------------+
| time_format(current_time,'%f') |
+--------------------------------+
| 000000                         |
+--------------------------------+
1 row in set (0.02 sec)

新しい関数

約20の新しい時間関数が追加されました。追加されたもの
はMaxDBやOracleのようなデータベースであるものに類似
しています。

ADDTIME(temporal_expression, time_expression)
SUBTIME(temporal_expression, time_expression)

    ADDTIMEとSUBTIME 関数は時間の計算をすることができます。2つ
の引数を取ります。最初は時間の値で2つ目はTIMEの値に
なります。ADDTIMEは時間の引数を最初のエクスプレッション
に足して結果を変換します。予想どおりSUBTIME は最初のエクスプレッション
から時間の引数を差し引きます。どちらもどちらかの引数が
NULLの場合はNULLを変換します。

mysql> select addtime('10:15:30','02:10:00'), subtime('2004-10-15 
10:15:30','02:10:00');
+--------------------------------+-------------------------------------------+
| addtime('10:15:30','02:10:00') | subtime('2004-10-15 10:15:30','02:10:00') 
|
+--------------------------------+-------------------------------------------+
| 12:25:30                       | 2004-10-15 08:05:30 
|
+--------------------------------+-------------------------------------------+
1 row in set (0.20 sec)

DATEDIFF(temporal_expression, temporal_expression)

    DATEDIFF 関数は2つの引数間の日にちを返還します。どちらも日の
値でなければなりません。どちらかの、引数がNULLの場合は
NULLを返還します。

mysql> select datediff('2004-10-20','2004-10-10');
+-------------------------------------+
| datediff('2004-10-20','2004-10-10') |
+-------------------------------------+
|                                  10 |
+-------------------------------------+
1 row in set (0.02 sec)

TIMEDIFF(temporal_expression, temporal_expression)

    TIMEDIFF関数も時間計算をする関数です。 この関数は2つの
時間の引数の差を返還します。 どちらの引数も時間の値に
ならないといけません。どちらかの引数がNULLであればTIMEDIFFは
NULLを返還します。

mysql> select timediff('10:30:15','02:10:00');
+---------------------------------+
| timediff('10:30:15','02:10:00') |
+---------------------------------+
| 08:20:15                        |
+---------------------------------+
1 row in set (0.02 sec)

DATE(temporal_expression)
TIME(temporal_expression)

    DATE関数は日時の日の部分を返還します。
どちらかの引数がNULLの場合はNULLを返還します。

    TIME 関数はDATE 関数を補足します。時間の値をとって
TIMEの部分を返還します。引数の値がNULLであればNULLを
返還します。

mysql> select date('2004-10-01 10:15:30'), time('2004-10-01 10:15:30');
+-----------------------------+-----------------------------+
| date('2004-10-01 10:15:30') | time('2004-10-01 10:15:30') |
+-----------------------------+-----------------------------+
| 2004-10-01                  | 10:15:30                    |
+-----------------------------+-----------------------------+
1 row in set (0.02 sec)

MAKEDATE(year, day_of_year)
MAKETIME(hour, minute, second)

    MAKEDATE 関数は2つの引数を組み合わせて結果を返還します。
どちらの引数も正の整数である必要があります。最初の引数は
YEARの値を示し、2番目はその年の日を示します。この関数はどちらかの
引数がNULLだとNULLを返還します。MAKEDATE はday_of_yearの値
がゼロかゼロ以下の場合はNULLを返還します。

    MAKETIME 関数は3つの引数をとります。− HOUR,
MINUTEとSECONDーーそして3つを組み合わせた時間を返還します。
それぞれの引数は整数でなければなりません。いずれかの引数が
NULLの場合はNULLを返還します。

mysql> select makedate(2004,152), maketime(10,15,30);
+--------------------+--------------------+
| makedate(2004,152) | maketime(10,15,30) |
+--------------------+--------------------+
| 2004-05-31         | 10:15:30           |
+--------------------+--------------------+
1 row in set (0.02 sec)

TIMESTAMP(temporal_expression)
TIMESTAMP(date_expression, time_expression)

    TIMESTAMP 関数は2つの形式があります。

    最初の形式では日の値をとり、TIMESTAMPの値として返還します。

mysql> select timestamp('2004-10-15');
+-------------------------+
| timestamp('2004-10-15') |
+-------------------------+
| 2004-10-15 00:00:00     |
+-------------------------+
1 row in set (0.02 sec)

    2番目の形式ではTIMESTAMP は2つの引数をとります。
日の値とTIMEの値です。TIMEの値は最初のエクスプレッション
に加算され、TIMESTAMPは結果をTIMESTAMPの値として返還します。

mysql> select timestamp('2004-10-15','10:15:30');
+------------------------------------+
| timestamp('2004-10-15','10:15:30') |
+------------------------------------+
| 2004-10-15 10:15:30                |
+------------------------------------+
1 row in set, 1 warning (0.02 sec)

    それぞれの場合、引数がNULLの場合はNULLを返還します。

本論からはそれますが。TIMESTAMPのデータタイプは4.1で少し変更
されました。最初の頃のMySQLの版ではTIMESTAMPはオプションとして
ディスプレイの幅の引数がありました。以下のように
表示するときのTIMESTAMP のコラムのサイズを指定するものです。

mysql> create table xy (col1 timestamp(8));
Query OK, 0 rows affected (0.41 sec)

mysql> insert into xy values('2004-10-01 10:15:30');
Query OK, 1 row affected (0.01 sec)

4.0では:

mysql> select * from xy;
+----------+
| col1     |
+----------+
| 20041001 |
+----------+
1 row in set (0.02 sec)

このシンタクスはまだOKですが、4.1からは効かなくなります。
4.1.0 のリリース以降はIMESTAMPの値は'YYYY-MM-DD HH:MM:SS'と
いうストリング形式で返還され異なったタイムスタンプの長さは
サポートされません。

4.1では同じことが以下のようになります。

mysql> select * from xy;
+---------------------+
| col1                |
+---------------------+
| 2004-10-01 10:15:30 |
+---------------------+
1 row in set (0.02 sec)

DAY(date_expression)

    DAY関数はDAYOFMONTH()と同じです。日にちの値の引数から
日の部分を返還します。引数がNULLの場合はNULLを返還します。

mysql> select day('2004-10-01');
+-------------------+
| day('2004-10-01') |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.02 sec)

LAST_DAY(date_expression)

    LAST_DAY関数は日にちの値をとりその月の最後の日を返還します。
 LAST_DAYは引数がNULLであるか正しくない値の場合(例'2004-10-32')
はNULLを返還します。

mysql> select last_day('2004-10-01');
+------------------------+
| last_day('2004-10-01') |
+------------------------+
| 2004-10-31             |
+------------------------+
1 row in set (0.02 sec)

MICROSECOND(time_expression)

    MICROSECOND 関数は時間の値を引数としてとってマイクロ秒
の部分を返還します。MICROSECOND は引数がNULLであればNULLを
返還します。

mysql> select microsecond('2004-10-15 10:15:30.999999');
+-------------------------------------------+
| microsecond('2004-10-15 10:15:30.999999') |
+-------------------------------------------+
|                                    999999 |
+-------------------------------------------+
1 row in set (0.03 sec)

WEEKOFYEAR(temporal_expression)

    WEEKOFYEAR関数は日にちの値の引数のカレンダーの週を計算して
週の番号を返還します。結果は1(年の最初)から53(年の最後)
の間です。年の最初の週はその年で木曜がある週のことです。
(言い換えると1月4日を含みます。)
WEEKOFYEARは引数がNULLになるとNULLを返還します。

mysql> select weekofyear('2004-10-15'), weekofyear('2000-01-01');
+--------------------------+--------------------------+
| weekofyear('2004-10-15') | weekofyear('2000-01-01') |
+--------------------------+--------------------------+
|                       42 |                       52 |
+--------------------------+--------------------------+
1 row in set (0.01 sec)

STR_TO_DATE(temporal_string, format_string)

    STR_TO_DATE関数はtemporal_string引数を
DATE, TIME, DATETIME, IMESTAMP の値にformat_string 引数
で指定された形式で変換します。

    format_string の引数はDATE_FORMATの関数と同じ形式
をとります。temporal_stringは同じ形式で書かれた時間の値で
STR_TO_DATEは引数が誤った値かNULLであればNULLを返還します。

mysql> select str_to_date('2004-10-15 10:15:30','%Y-%m-%d %H:%i:%s');
+--------------------------------------------------------+
| str_to_date('2004-10-15 10:15:30','%Y-%m-%d %H:%i:%s') |
+--------------------------------------------------------+
| 2004-10-15 10:15:30                                    |
+--------------------------------------------------------+
1 row in set (0.02 sec)

mysql> select str_to_date('2004-10-15 10:15:30','%d.%m.%y %H.%i');
+-----------------------------------------------------+
| str_to_date('2004-10-15 10:15:30','%d.%m.%y %H.%i') |
+-----------------------------------------------------+
| NULL                                                |
+-----------------------------------------------------+
1 row in set (0.02 sec)

GET_FORMAT(temporal_constant, format_string_constant)

    GET_FORMAT関数は、DATE_FORMATとTIME_FORMAT関数に使った
引数のような形式のストリングを返還します。 temporal_constant
引数は以下の4つのどれかの値をとります。DATE, TIME, DATETIMEと
TIMESTAMP (しかし、これはTIMESTAMPに関しては4.1.4まではない。)
format_string_constant 引数は5つの値のどれかを取ります。
'EUR', 'USA', 'JIS', 'ISO', もしくは'INTERNAL'.

mysql> select get_format(timestamp,'iso');
+-----------------------------+
| get_format(timestamp,'iso') |
+-----------------------------+
| %Y-%m-%d %H:%i:%s           |
+-----------------------------+
1 row in set (0.02 sec)

    GET_FORMATの2つの引数の正しい値の組み合わせは20の可能性
があります。5つはDATE, 5つはTIME, 5つはDATETIME,
そして5つはTIMESTAMP. 時間の定数としてTIMESTAMP を使うと
GET_FORMAT はDATETIMEと以下のように同様の値を返還します。

    関数コール          結果
    GET_FORMAT(DATE,'USA') '%m.%d.%Y'
    GET_FORMAT(DATE,'JIS') '%Y-%m-%d'
    GET_FORMAT(DATE,'ISO') '%Y-%m-%d'
    GET_FORMAT(DATE,'EUR') '%d.%m.%Y'
    GET_FORMAT(DATE,'INTERNAL') '%Y%m%d'
    GET_FORMAT(DATETIME,'USA') '%Y-%m-%d-%H.%i.%s'
    GET_FORMAT(DATETIME,'JIS') '%Y-%m-%d %H:%i:%s'
    GET_FORMAT(DATETIME,'ISO') '%Y-%m-%d %H:%i:%s'
    GET_FORMAT(DATETIME,'EUR') '%Y-%m-%d-%H.%i.%s'
    GET_FORMAT(DATETIME,'INTERNAL') '%Y%m%d%H%i%s'
    GET_FORMAT(TIME,'USA') '%h:%i:%s %p'
    GET_FORMAT(TIME,'JIS') '%H:%i:%s'
    GET_FORMAT(TIME,'ISO') '%H:%i:%s'
    GET_FORMAT(TIME,'EUR') '%H.%i.%S'
    GET_FORMAT(TIME,'INTERNAL') '%H%i%s'

    これらの形式はMaxDBから。

    MySQLレファレンスマニュアルは GET_FORMATが
DATE_FORMAT とSTR_TO_DATEの関数と使われる際の
2つの例を示しています。ここに繰り返します。

mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));
    -> '03.10.2003'
mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));
    -> 2003-10-31

UTC_DATE
UTC_DATE()
UTC_TIME
UTC_TIME()
UTC_TIMESTAMP
UTC_TIMESTAMP()

    これらの関数は括弧付きか括弧なしで書かれますが、無引数の
関数で引数を取りません。

    UTC_DATE は現在の UTC ( Universal Coordinated Time)
の日を'YYYY-MM-DD'かYYYYMMDD の形式で返還します。
(関数がストリングとして使用されるか数字として使われるかによって。)
ところで、大抵の人は UTC 時間を "Greenwich Mean Time"と呼びます。

    UTC_TIME 関数は現在のUTC 時間を 'HH:MM:SS' または HHMMSS
の形式で返還します。 (関数がストリングとして使用されるか数字
として使われるかによって。)

    UTC_TIMESTAMP 関数は現在のUTC 日と時間を'YYYY-MM-DD HH:MM:SS'
またはYYYYMMDDHHMMSS の形式で返還します。 (関数がストリングとして
使用されるか数字として使われるかによって。)

mysql> select utc_date(), utc_date+1;
+------------+------------+
| utc_date() | utc_date+1 |
+------------+------------+
| 2004-09-14 |   20040915 |
+------------+------------+
1 row in set (0.02 sec)

mysql> select utc_time(), utc_time+1;
+------------+------------+
| utc_time() | utc_time+1 |
+------------+------------+
| 16:09:12   |     160913 |
+------------+------------+
1 row in set (0.03 sec)

mysql> select utc_timestamp(), utc_timestamp+1;
+---------------------+-----------------+
| utc_timestamp()     | utc_timestamp+1 |
+---------------------+-----------------+
| 2004-09-14 16:12:36 |  20040914161237 |
+---------------------+-----------------+
1 row in set (0.02 sec)

タイムゾーンの処理

MySQL 4.1はタイムゾーンの時間の値を処理するサポートを
増加しました。

例えばMySQL 4.1.3からCURRENT_DATE(), CURRENT_TIME(),
CURRENT_TIMESTAMP(), FROM_UNIXTIME(), LOCALTIME,
LOCALTIMESTAMP, NOW, SYSDATE,  UNIX_TIMESTAMP()
の関数は現在の接続のタイムゾーンの値を返還します。
UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP() 関数は値を
Universal Coordinated または UTC時間で返還します。

更に新しいCONVERT_TZ 関数はDATETIME と TIMESTAMPの値をタイムゾーン
間で変換します。

最後に TIMESTAMP データタイプのデータ値は自動的に現在の
接続のタイムゾーンに変換されます。TIMESTAMP の値は
Oracleの TIMESTAMP WITH LOCAL TIME ZONE値と同じような
振る舞いをします。TIMESTAMPコラムに格納された値はUTCに正規化されて
SELECT時に現在の接続タイムゾーンに変換されます。
これで MySQL は「現在」の TIMESTAMPの値をデータベースが移動されても
表示できます。

更に、TIMESTAMPデータタイプの変更は以下です。

InnoDBのテーブル内のTIMESTAMPの内部の表現方法は4.0と4.1の間で
変更されました。また4.1.4でまた変更されました。この変更は
アップグレードの後ではInnoDBテーブルに属するTIMESTAMPコラム
の誤った値を返還します。

この問題を解決すべく、4.1.3およびそれ以前の版を4.1.4にアップグレード
する際、mysqldumpを使用してTIMESTAMPコラムを含む全てのInnoDB
テーブルをセーブしてまた元に戻します。

タイムゾーンの話題に戻りましょう。前の版では、サーバ に関係する
タイムゾーンは--timezone=timezone_nameオプションをmysqld_safe
にセットするか、mysqldをスタートする際にTZ環境変数をセットします。

今は以下のように動作します。

MySQL 4.1.3よりMySQLサーバは数個のタイムゾーンを保存します。それは
システム・タイムゾーン, サーバの現在のタイムゾーンと
それぞれのクライアントの接続のタイムゾーン。

システム・タイムゾーン

    サーバーがスタートするときにホストマシンのタイムゾーンを
探し、system_time_zoneのシステム変数を自動的セットします。

    この変数は取り除かれた古いタイムゾーンを取り替えます。
前の版からマイグレートするユーザは 全てのtimezoneのシステム
変数をsystem_time_zoneに変更すべきです。

サーバーの現在のタイムゾーン

    ダイナミックでグローバルなtime_zone変数はサーバーが作動している
タイムゾーンを指定します。この変数の最初の値は'SYSTEM'で
単にサーバーのタイムゾーンとシステム・タイムゾーンが同じで
あると示しています。

    初期値は--default-time-zone=timezoneのオプションでセット
されます。SUPER の権限を持つユーザはグローバルの値をランタイム
にセットできます。これにはSET GLOBAL time_zone ステートメント
を以下のように使います。

mysql> SET GLOBAL time_zone = timezone;

    現在のグローバルなタイムゾーンの値を得るためには
SELECT @@xxxxxxxxxx_zone 変数を使います。

mysql> SELECT @@xxxxxxxxxx_zone;

それぞれのクライアントように、接続タイムゾーン

    それぞれのクライアントはダイナミックなtime_zone
セッション変数で指定されたそれぞれのタイムゾーンのセッティング
をもっています。この変数の初期値はグローバルなtime_zone 変数
と同じです。しかし、ランタイムでもSET time_zoneステートメント
で設定しなおしが効きます。

mysql> SET time_zone = timezone;

    現在のセッション・タイムゾーンの値を得るには、
SELECT @@xxxxxxxxxx_zone 変数で。

mysql> SELECT @@xxxxxxxxxx_zone;

SET GLOBAL timezoneとSET time_zoneステートメントの引数
のtimezoneをみてください。これはサーバーオプションの
--default-time-zone同じです。
これらの引数の値は次の3つのうちの1つの方法でセットします。

   1. UTCからのオフセットを指定するストリングとして、例えば
'-7:00'のような'[+|-]HH:MM'な形式でタイムゾーンはUTCより
7時間前(マウンテン時間)であることを示します。この方法は
何時も有効です、OSに関わらずまたタイムゾーンテーブルが
設定されていなくても。
   2. 完全なタイムゾーンの名前を指定して、例えば「マウンテン
夏時間」とか
   3. または正式タイムゾーンの省略形で。マウンテン
夏時間」のかわりに「MDT」ここで使用した名前はOS
によるので何処にでも使えるというわけではない。

最後の2つの方法はUnixのベースのみ、またMySQLのデータベース
のなかで、タイムゾーン関連のテーブルが生成され、値を格納した
場合に限ります。

4.1.3またはその後の版をインストールするとタイムゾーンの
テーブルを生成しますが、値を格納はしません。最後のステップは
手動でなければなりません。

初めのころのMySQLからマイグレーションをするユーザは
MySQLデータベースをアップデートして、タイムゾーン
テーブルを別に生成する必要があります。そうでなければ、
新しいタイムゾーンの機能を使うことができません。

MySQL 4.0 (または以前の版)と 4.1.3 (またはそれ以後の版)
間で変換するには2つの方法があります。

ステップ 1: 4.1.2からかそれ以前の版よりの場合

    mysql_fix_privilege_tablesのスクリプトを実行して
正しいタイムゾーンのテーブルを生成してください。

ステップ 2: MySQL 4.1.3またはそれ以降の版をUnixベースの
システムで作動している場合(これはウインドウシステムでは
動作しません。)

    タイムゾーンのテーブルをセット

    このためにはmysql_tzinfo_to_sqlプログラムを実行してください。
これはMySQLのディストリビューションの一部です。 mysql_tzinfo_to_sql
はOSのシステムのタイムゾーンのファイルを読みんこんでから
SQLのステートメントを生成します。このSQLステートメント
はMySQLによって処理されてタイムゾーンテーブルを
ロードします。

    mysql_tzinfo_to_sqlを正常に動作させるには、サーバーの
タイムゾーンのファイルがどこに格納されているかを
知っている必要があります。/usr/share/zoneinfoの
ようなディレクトリの名前を探してください。 そのディレクトリの名前
をコマンドラインでmysql_tzinfo_to_sqlに指定してください。
その出力をmysqlのプログラムに渡してください。この例のように。

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

mysql_tzinfo_to_sqlはうるう秒の情報を生成します。データベース内
でうるう秒を考慮しなければならないインストレーションは以下
のように、MySQLののプログラムに必要な情報を含むファイルの
名前を指定することでうるう秒の情報を初期化できます。

shell> mysql_tzinfo_to_sql --leap file-name | mysql -u root mysql

最後に2つのタイムゾーン間のdatetimeの値を変換するため
にタイムゾーンのテーブルを使用する新しい関数があります。

CONVERT_TZ(temporal_expression, from_timezone, to_timezone)

    CONVERT_TZ 関数は3つの引数をとります。最初の引数は
DATETIMEかTIMESTAMP の値でなければなりませんが、他は'[+|-]HH:MM'
の形式のタイムゾーンか、名前で表されているタイムゾーンのID
例えば'GMT' とか'Greenwich Mean Time'とかでなければなりません。
名前のついたタイムゾーンはタイムゾーンのテーブルが正しく
セットアップされていれば、使用することができます。

    CONVERT_TZ は最初の引数はfrom_timezone引数で与えられた
タイムゾーンに属すると仮定します。関数はその値をto_timezone
引数で与えられたタイムゾーンに属するdatetimeの値に変換します。

    実際同じdatetimeの値を得ますが、それは異なったタイムゾーン
の観点です。関数はどの引数が正しくなくとも、またはどれか
の引数がNULLの場合も NULLを返却

mysql> select convert_tz('2004-10-01 10:15:30','+01:00','+07:00');
+-----------------------------------------------------+
| convert_tz('2004-10-01 10:15:30','+01:00','+07:00') |
+-----------------------------------------------------+
| 2004-10-01 16:15:30                                 |
+-----------------------------------------------------+
1 row in set (0.02 sec)

秒以下

秒以下のサポートは簡単です。4.1ではあまりありませんが、
基礎ができたので、後の版でサポートが加算されます。

現在のMySQLは時間の値のコラムで秒以下の詳細を
定義できません。将来の版にはTIMESTAMPデータタイプにこの機能
を追加する予定ですが。シンタクス的には受け入れられますが
 秒以下のの定義には何もなされません。

シンタクスが受け入れられるのは、前の版で TIMESTAMPデータタイプ
に関してディスプレーの幅を規定できるからです。

秒以下の部分を含むTIMESTAMPの値をTIMESTAMPコラムに
エラーなしでINSERTすることは可能です。しかし、完全な値を
取り出すことはできません。それどころか、ミリ秒の部分もだめです。
それは INSERT時にミリ秒の部分は取り除かれてしまうからです。

mysql> create table xy(tscol timestamp);
Query OK, 0 rows affected (0.09 sec)

mysql> insert into xy (tscol) values ('2004-10-15 10:15:30.999999');
Query OK, 1 row affected (0.01 sec)

mysql> select * from xy;
+---------------------+
| tscol               |
+---------------------+
| 2004-10-15 10:15:30 |
+---------------------+
1 row in set (0.04 sec)

mysql> select extract(microsecond from tscol) from xy;
+---------------------------------+
| extract(microsecond from tscol) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

秒以下を含むことができる無項時間関数である
CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME,
LOCALTIMESTAMP, NOW, SYSDATEも秒以下の部分は変換しません。

ミリセカンドはどう扱いますか。

MySQL 4.1 はミリセカンドを考慮する時間の計算ができます。前述のように
DATE_ADDとDATE_SUB 関数はMICROSECOND, SECOND_MICROSECOND,
MINUTE_MICROSECOND, HOUR_MICROSECOND, DAY_MICROSECONDの間隔を
引数にとり、与えられた時間の値に対して加算したり減算します。
INTERVALキーワードに関する時間演算も同じことができます。

mysql> select current_timestamp + INTERVAL 1.999999 second_microsecond;
+----------------------------------------------------------+
| current_timestamp + INTERVAL 1.999999 second_microsecond |
+----------------------------------------------------------+
| 2004-09-16 16:28:45.999999                               |
+----------------------------------------------------------+
1 row in set (0.02 sec)

新しいADDTIMEとSUBTIME 関数はマイクロセカンドを含む演算も
行います。TIMEDIFF関数も同様です。DATE_FORMAT, TIME_FORMATと
STR_TO_DATE 関数は秒以下の値を含む時間の値を正しく表示できる
機能があるストリングの形式をとることができます。EXTRACTとMICROSECOND
の機能は時間値の秒以下の値を返還します。TIMEとTIMESTAMP 関数は
秒以下の部分を含む値を返還します。

まとめ: MySQLの秒以下へのサポートは4.1から始まり、ミリセカンドを含む
時間の値を処理します。しかし、秒以下の値を実際にはデータベースに
は格納しません。
---------------------
Zen Kishimoto                        zen@xxxxxxxxxx
IP Devices, Inc.                       (408) 567-9391
2175 De La Cruz Blvd., Suite 10  (801) 720-8847 (FAX)
Santa Clara, CA 95050 



[前][次][番号順一覧][スレッド一覧]