sql >> データベース >  >> RDS >> Sqlserver

SQL Serverは、暗黙の日時変換の形式をどのように決定しますか?

    これは、オペレーティングシステムの地域設定、現在のユーザーの言語、日付形式の設定など、さまざまな要因によって異なります。デフォルトでは、WindowsはUS Englishを使用します 、およびユーザーの設定はUS English およびMDY

    しかし、これがどのように変化するかを示すいくつかの例があります。

    ユーザーはBRITISH言語設定を使用しています:

    -- works:
    SET LANGUAGE BRITISH;
    SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
    
    -- fails:
    SELECT CONVERT(DATETIME, '04/13/2012');
    GO
    

    (エラー)

    ユーザーはFrançaisを使用しています:

    -- works:
    SET LANGUAGE FRENCH;
    SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
    
    -- fails:
    SELECT CONVERT(DATETIME, '04/13/2012');
    GO
    

    (エラー)

    ユーザーは再びFrançaisを使用しています:

    SET LANGUAGE FRENCH;
    
    -- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
    SELECT CONVERT(DATETIME, '2012-04-30');
    GO
    

    (エラー)

    ユーザーはMDYの代わりにDMYを使用しています:

    SET LANGUAGE ENGLISH;
    SET DATEFORMAT DMY;
    
    -- works:
    SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
    
    -- fails:
    SELECT CONVERT(DATETIME, '04-30-2012');
    GO
    

    (エラー)

    常に最善の策は、ISO標準、非地域、安全、明確な日付形式を使用することです。私が通常お勧めする2つは次のとおりです。

    YYYYMMDD                  - for date only.
    YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.
    

    これらのどれも失敗しません:

    SET DATEFORMAT MDY;
    SET LANGUAGE ENGLISH;
    SELECT CONVERT(DATETIME, '20120430');
    SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
    SET LANGUAGE FRENCH;
    SELECT CONVERT(DATETIME, '20120430');
    SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
    SET LANGUAGE BRITISH;
    SELECT CONVERT(DATETIME, '20120430');
    SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
    SET DATEFORMAT DMY;
    SELECT CONVERT(DATETIME, '20120430');
    SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
    

    したがって、ユーザーがフリーテキストの日付形式を入力できるようにする(または信頼性の低い形式を自分で使用する)のではなく、入力文字列を制御して、これらの安全な形式の1つに準拠していることを確認することを強くお勧めします。そうすれば、ユーザーがどのような設定を持っているか、または基礎となる地域の設定が何であるかは関係ありません。日付は常に意図された日付として解釈されます。現在、ユーザーがフォームのテキストフィールドに日付を入力できるようにしている場合は、それを停止し、カレンダーコントロールまたは少なくとも選択リストを実装して、SQLServerに返される文字列形式を最終的に制御できるようにします。

    背景については、TiborKarasziの「日時の究極のガイド」をお読みください。データ型」 と私の投稿" Badキックする習慣:日付/範囲クエリの誤った処理。」



    1. mysql selectを書き換えて時間を短縮し、tmpをディスクに書き込みます

    2. pyodbcはデータベースに接続できません

    3. SQL * Plus/SQLcl出力グリッドに垂直方向の境界線を追加する方法

    4. SQLビュー