重要:
この記事を読む前に、後述の特記事項を必ずお読みください。
この記事は、Linux、UNIX®、およびWindows®用IBM® DB2®Universal Database™について書かれています。
この短い記事は、初めてDB2を使用し、日付と時刻の操作方法について理解したい読者を対象としています。他のデータベースの使用経験がある読者のほとんどは、DB2での操作方法が簡単なことをうれしい驚きと感じることでしょう。
SQLを使用して現在の日付、時刻、およびタイムスタンプを取得するには、適切なDB2レジスターを参照します。
SELECT current date FROM sysibm.sysdummy1
SELECT current time FROM sysibm.sysdummy1
SELECT current timestamp FROM sysibm.sysdummy1
|
sysibm.sysdummy1表は、上記のようにDB2レジスター値の発見に使用できるメモリー内の特別な表です。さらにVALUESキーワードを使用して、レジスターまたは式を評価できます。たとえば次のSQLステートメントは、DB2コマンド行プロセッサー(CLP)から同様の情報を示します。
VALUES current date
VALUES current time
VALUES current timestamp
|
以降の例では、SELECT … FROM sysibm.sysdummy1の繰り返しやVALUES文節を使用せずに、関数または式のみを示します。
現在時刻または現在のタイムスタンプをGMT/CUTに調整するには、現在時刻またはタイムスタンプから現在の時間帯レジスターを減算します。
current time - current timezone
current timestamp - current timezone
|
すでに日付、時刻、およびタイムスタンプを取得している場合、必要に応じて、適切な関数を使用して年、月、日、時、分、秒、およびマイクロ秒の部分を個別に抽出できます。
YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)
|
タイムスタンプからも、とても簡単に日付および時刻を個別に抽出できます。
DATE (current timestamp)
TIME (current timestamp)
|
さらに、英語による日付および時刻計算も実行できます。
current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS - 3 MINUTES + 10 SECONDS
|
2つの日付の間の日数を計算するには、次のように日付を減算します。
days (current date) - days (date('1999-10-22'))
|
次の例は、マイクロ秒の部分をゼロにリセットして、現在のタイムスタンプを取得する方法を示しています。
CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS
|
日付値または時刻値に別のテキストを連結したい場合、まず値を文字ストリングに変換する必要があります。これは、CHAR()関数を使用して簡単に実行できます。
char(current date)
char(current time)
char(current date + 12 hours)
|
文字ストリングを日付値または時刻値に変換するには、以下の関数を使用できます。
TIMESTAMP ('2002-10-20-12.00.00.000000')
TIMESTAMP ('2002-10-20 12:00:00')
DATE ('2002-10-20')
DATE ('10/20/2002')
TIME ('12:00:00')
TIME ('12.00.00')
|
TIMESTAMP()、DATE()、およびTIME()関数は、他のフォーマットもいくつか受け取れます。上記のフォーマットは単なる例であり、使用可能な他のフォーマットの発見は読者の演習として残しておきます。
時には、2つのタイムスタンプ間の差について知りたい場合があります。このために、DB2ではTIMESTAMPDIFF()という組み込み関数が提供されています。しかし、うるう年を計上せず、1カ月は30日であることを前提としているため、戻される値は近似値です。次の例は、2つの日付間における時刻の近似差の検出方法を示します。
timestampdiff (<n>, char(
timestamp('2002-11-30-00.00.00')-
timestamp('2002-11-08-00.00.00')))
|
<n>には、以下のいずれかの値を使用して、結果時間の単位を表示します。
- 1 = 秒の小数部
- 2 = 秒
- 4 = 分
- 8 = 時間
- 16 = 日
- 32 = 週
- 64 = 月
- 128 = 四半期
- 256 = 年
TIMESTAMPDIFF()は、2つの日付が離れている場合よりも接近している場合の方がより正確です。より正確な計算が必要な場合、以下を使用して時刻の差(秒単位)を算出できます。
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
|
さらに便宜上、上記のSQLユーザー定義関数も作成できます。
CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)
RETURNS INT
RETURN (
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
)
@
|
所定の年がうるう年かどうか確認する必要がある場合、その年が何日間であるかを算出する便利なSQL関数を作成できます。
CREATE FUNCTION daysinyear(yr INT)
RETURNS INT
RETURN (CASE (mod(yr, 400)) WHEN 0 THEN 366 ELSE
CASE (mod(yr, 4)) WHEN 0 THEN
CASE (mod(yr, 100)) WHEN 0 THEN 365 ELSE 366 END
ELSE 365 END
END)@
|
最後に、以下の表に日付操作の組み込み関数を示します。これは、ニーズに合った関数を簡単に見つけるためのものであり、完全なリファレンスではありません。これら関数の詳細は、「SQL解説書」を参照してください。
| SQL日付/時刻関数 | |
| DAYNAME | 引き数の日の部分の曜日名(例:Friday)を含む大文字小文字混合文字ストリングを戻します。 |
| DAYOFWEEK | 引き数の曜日を1〜7の範囲の整数値として戻します。1は日曜日を表します。 |
| DAYOFWEEK_ISO | 引き数の曜日を1〜7の範囲の整数値として戻します。1は月曜日を表します。 |
| DAYOFYEAR | 引き数の年間通算日を、1〜366の範囲の整数値として戻します。 |
| DAYS | 日付の整数表記を戻します。 |
| JULIAN_DAY | 紀元前(ユリウス暦の起点)からの経過日数を示す整数値を、引き数で指定した日付値に戻します。 |
| MIDNIGHT_SECONDS | 午前0時から引き数で指定した時刻値までの秒数を表す0〜86400の範囲の整数値を戻します。 |
| MONTHNAME | 引き数の月の部分の名前(例:January)を含む大文字小文字混合文字ストリングを戻します。 |
| TIMESTAMP_ISO | 日付、時刻、またはタイムスタンプの引き数に基づくタイムスタンプ値を戻します。 |
| TIMESTAMP_FORMAT | 文字テンプレートを使って解釈された文字ストリングからタイムスタンプを戻します。 |
| TIMESTAMPDIFF | 2つのタイムスタンプ間の差に基づいて、最初の引き数によって定義されたタイプの間隔数の見積もりが戻されます。 |
| TO_CHAR | 文字テンプレートを使ってフォーマットされたタイムスタンプの文字表記を戻します。TO_CHARは、VARCHAR_FORMATの同義語です。 |
| TO_DATE | 文字テンプレートを使って解釈された文字ストリングからタイムスタンプを戻します。TO_DATEは、TIMESTAMP_FORMATの同義語です。 |
| WEEK | 引き数の年間通算週番号を1〜54の範囲の整数値として戻します。週は日曜日から始まります。 |
| WEEK_ISO | 引き数の年間通算週番号を1〜53の範囲の整数値として戻します。 |
上記の関数は、筆者が直面した日付と時刻に関する最も代表的な質問に答えるものです。もし、さらに例を追加することをご希望のフィードバックがあれば、この記事を更新します。(実は、すでに2回更新しています。読者の皆さん、ありがとうございました。)
謝辞
Bill Wilkins、DB2 Business Partner Enablement、Randy Talsmaの各氏に対し、謝意を表します。
特記事項
本記事には、サンプル・コードが含まれています。IBMは、読者(「ライセンス所有者」)に、このサンプル・コードを使用する非排他的でロイヤルティーのないライセンスを付与するものとします。ただし、このサンプル・コードは現状のまま提供され、黙示の商品性の保証、特定目的への適合性の保証、および権利の不侵害の保証を含む、明示または黙示の保証なく提供されるものです。IBMとIBMのライセンス交付者は、ソフトウェアの使用の結果としてライセンス所有者が受けた損害については、一切の責任を負いません。いかなる場合においても、このソフトウェアの使用または使用不能の結果として生ずる逸失売上げ、逸失利益、データの損失、直接的損害、間接的損害、特別の損害、結果的損害、付随的損害、あるいは懲罰的損害賠償について、原因の如何また責任論の種類の如何にかかわらず、たとえこの種の損害発生の可能性があることをIBMがあらかじめ警告されている場合であっても、IBMとIBMのライセンス交付者は一切責任を負わないものとします。
-
developerWorks Japan: Information Management : Information Managementの日本語技術情報サイトです
-
developerWorks: Information Management(US) : Information Managementの英語の技術情報サイトです
Paul Yip氏は、分散プラットフォーム用DB2を開発しているIBMトロント研究所に勤務するデータベース・コンサルタントです。主な仕事は、他のデータベースからDB2へのアプリケーションの移行について企業を支援し、現在のスキルをDB2ワールドに適用する方法について熟練したデータベース管理者を教育することです。DB2に関するいくつかの記事やホワイトペーパーの著者であり、顧客のニーズに対応した執筆を行っています。Yip氏の連絡先は、ypaul@ca.ibm.comです。