キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< おうちで学べるデータベースのきほん、5刷になりました! | main | [便乗企画] 「SQL大量発行処理をいかにして高速化するか」for MySQL >>
プログラマのためのSQL第四版読書会(37) 38.5 その他の時間関数:君のDOW(だう)はどう?
0
    本日は以下の勉強会でした。

    プログラマのためのSQL 読書会(37)

    38.5 その他の時間関数(Other Temporal Functions)で、DOW(Day Of Week)という曜日を数値で返す関数の説明があり、
    とりあえず翻訳でSQL Anywhereから差し替えられた[PostgreSQL]説明が間違っているのと、各データベースの違いが顕著だったので、ここにまとめておきます。

    [誤] 2〜8の値を返し、8が日曜日である。
    [正] 0〜6の値を返し、0が日曜日である。

    なんかぜんぜんちがうね。。。。

    なお、数値が日曜日スタートか、月曜日スタートか、数値のはじまりが0か1かですげー混乱すると思うんですが。。。。

    ちなみにISOでは、月曜日スタートで、月曜日が1、日曜日が7になります。

    ISO 8601(wikipedia)
    D は曜日を表し、月曜日が 1、日曜日は 7 である。「8」「9」は表記数値とされない(エラー扱い)。

    上記例のPostgreSQLにもisodowという関数があり、ISOと同様な動作になります。

    ちなみにODBCでは、日曜日スタートで、日曜日が1, 土曜日が7になります。
    (プログラマのためのSQLではSQL AnywhereのDOWがとりあげられていて、これと同じ仕様です)
    MySQLのDAYOFWEEKは、このODBC標準に準拠しています。
    MySQLには曜日を求めるもうひとつの関数WEEKDAYがあり、こちらは月曜日スタートで月曜日が0、日曜日が6になります。二つを比較した次のブログエントリがわかりやすいです。

    MySQLで曜日を調べる(xykの日記)

    MySQLにはISO準拠のものがありませんが、WEEKDAYで求めた結果に+1するとISO準拠となります。

    [IBM Db2]
    Db2には1〜7を返す関数が二つあり、
    DAYOFWEEKは日曜日はじまりで、日曜日が1、土曜日が7を返します。
    DAYOFWEEK_ISOは月曜日はじまりで、月曜日が1、日曜日が7を返します。

    [MS SQL Server]

    SQL Serverでは、まず何曜日はじまりか、を設定する変数DATEFIRSTがあり、SET DATEFIRSTで開始曜日を通常7(つまり日曜日スタート)にするか1(つまり月曜日スタート)にするか決定できます。(@@DATEFIRSTで設定内容を確認できます)
    関数としてはDATEPART(weekday, 日付)もしくは短縮形のDATEPART(dw, 日付)で指定し返す値の範囲は1〜7です。
    前者の設定、つまり日曜日スタートでは、ODBC互換。
    後者の設定、つまり月曜日スタートでは、ISO互換になります。

    [Oracle]
    TO_CHAR(日付,'D')
    NLS_TERRITORYで、日曜日はじまりか、月曜日はじまりになるらしい。
    日本、アメリカでは日曜日スタートで、ODBC互換
    欧州では月曜日スタートで、ISO互換になります。

    [SQLite]
    strftime(日付,'%w')日曜日はじまりで、ゼロスタート。日曜日が0, 土曜日が6です。
    +1するとODBC互換になりますね。

    sqlite> select current_date;
    2019-03-01
    sqlite> select strftime('%w',current_date);
    5
    sqlite> select strftime('%w',current_date)+1;
    6

    ISO互換にするには、0を返すときに7を返せばいいので、以下のような感じかな。

    select case strftime(日付,'%w) when 0 then 7 else strftime(日付,'%w) end;

    modifier指定のweekdayは、weekdayを取得するのではなく、元の日付に対してweekday Nで
    指定した日付を返します。2019-03-01は金曜日で5ですので、以下のように4を指定すると木曜日、
    6を指定すると土曜日を返します。木曜日は2019-02-28ではなく、2019-03-07を返すところに注意。

    sqlite> select date(current_date,'weekday 4');
    2019-03-07
    sqlite> select date(current_date,'weekday 6');
    2019-03-02

    [Firebird]
    FirebirdではSQL標準(SQL-99)のEXTRACTを使います。
    EXTRACT(WEEKDAY FROM 日付)
    戻す値はSQLiteと同じです。

    EXTRACTは標準SQLなので、実はOracle, IBM Db2, MySQL, PostgreSQLがサポートしています
    なら、全部EXTRACTで統一すればイイとおもうのですが、実はWEEKDAY, YEARDAYはFirebirdしか
    サポートしていない
    のです。(PostgreSQLはWEEKDAYの代わりにdow, YEARDAYの代わりにdoyをサポートしています)そのためSQL標準だからといって、あまり強く押すことができません。

    JUGEMテーマ:コンピュータ



    | meijik | データベース | 02:00 | comments(0) | trackbacks(0) | - | - |









    http://blog.kimuradb.com/trackback/877569
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
    << May 2019 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (03/03)
    • 2019年の木村明治
      田中尚 (01/08)
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    • Windows上でのMySQLビルド方法
      kinoyasu (03/31)
    • 気軽に新しいMySQLを試してみる: MySQL Sandboxのススメ
      MeijiK (09/19)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE