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

SQL Serverで「time」を「datetime2」に変換する(T-SQLの例)

    この記事には、時間の変換の例が含まれています datetime2の値 SQLServerの値。

    時間を変換するとき datetime2の値 、値に追加情報が追加されます。これは、 datetime2 が原因です データ型には、日付と時刻の両方の情報が含まれます。 時間 一方、データ型には時間情報のみが含まれます。

    より具体的には、日付は「1900-01-01」に設定され(「1900-01-02」に切り上げられない限り)、時間コンポーネントがコピーされ、Microsoftのドキュメントによると、タイムゾーンオフセット00:00に設定されています( datetime2 であっても) データ型はタイムゾーンを認識せず、タイムゾーンオフセットを保持しません)。

    datetime2(n)の秒の小数部の精度の場合 値がtime(n)より大きい 値、値は切り上げられます。

    例1-CAST()を使用した明示的な変換

    明示的な変換の例を次に示します。この場合、私はCAST()を使用します SELECT内で直接機能します 時間から明示的に変換するステートメント datetime2

    DECLARE @thetime time;
    SET @thetime = '23:15:59.004007';
    SELECT 
      @thetime AS 'time',
      CAST(@thetime AS datetime2) AS 'datetime2';
    

    結果:

    +------------------+-----------------------------+
    | time             | datetime2                   |
    |------------------+-----------------------------|
    | 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |
    +------------------+-----------------------------+
    

    時間から変換する場合 datetime2 、日付コンポーネントが追加され、1900-01-01に設定されます 。

    ただし、日付が1900-01-02に切り上げられるシナリオがあります。 。これは、秒の小数部と使用する精度によって異なります。この例については、以下を参照してください。

    例2–分数秒の精度

    各データ型に割り当てられている秒の小数部の精度に応じて、異なる結果を得ることができます。これは、小数部の実際の値によって異なります。

    前の例では、両方のデータ型が同じ小数秒の精度を使用していました。これは、(精度を定義するために)スケールを指定しなかったため、両方ともデフォルトのスケール値(両方とも7)を使用したためです。

    明確にするために、スケール 数値の小数点の右側の桁数です。 精度 は数値の合計桁数です。

    とにかく、その例では、初期値に小数点以下6桁しか割り当てていないため、最後にゼロが追加されます。

    時間に高い精度を指定するとどうなりますか datetime2と比較した値 値:

    DECLARE @thetime time(7);
    SET @thetime = '23:15:59.1234567';
    SELECT 
      @thetime AS 'time',
      CAST(@thetime AS datetime2(4)) AS 'datetime2(4)';
    

    結果:

    +------------------+--------------------------+
    | time             | datetime2(4)             |
    |------------------+--------------------------|
    | 23:15:59.1234567 | 1900-01-01 23:15:59.1235 |
    +------------------+--------------------------+
    

    datetime2に4のスケールを指定する 値の場合、結果は小数点以下4桁に減らされ、この場合は切り上げられます。

    ご想像のとおり、切り上げられるのは小数部分だけではありません。小数部分によって分と秒が切り上げられる例を次に示します。

    DECLARE @thetime time(7);
    SET @thetime = '23:15:59.7654321';
    SELECT 
      @thetime AS 'time',
      CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';
    

    結果:

    +------------------+---------------------+
    | time             | datetime2(0)        |
    |------------------+---------------------|
    | 23:15:59.7654321 | 1900-01-01 23:16:00 |
    +------------------+---------------------+
    

    ただし、精度を変更することで、同じデータに対して異なる結果を得ることができます。小数点以下1桁でも精度を上げると、次のようになります。

    DECLARE @thetime time(7);
    SET @thetime = '23:15:59.7654321';
    SELECT 
      @thetime AS 'time',
      CAST(@thetime AS datetime2(1)) AS 'datetime2(1)';
    

    結果:

    +------------------+-----------------------+
    | time             | datetime2(1)          |
    |------------------+-----------------------|
    | 23:15:59.7654321 | 1900-01-01 23:15:59.8 |
    +------------------+-----------------------+
    

    したがって、この場合、分と秒はありません。 切り上げられます(ただし、ミリ秒は

    時刻を設定するとどうなりますか datetime2よりも低い精度のスケールを使用する値 価値。

    DECLARE @thetime time(0);
    SET @thetime = '23:15:59.004007';
    SELECT 
      @thetime AS 'time',
      CAST(@thetime AS datetime2) AS 'datetime2';
    

    結果:

    +----------+-----------------------------+
    | time     | datetime2                   |
    |----------+-----------------------------|
    | 23:15:59 | 1900-01-01 23:15:59.0000000 |
    +----------+-----------------------------+
    

    そして、私たちがそれに取り組んでいる間、これは私たちの精密なスケールが分数秒をもたらし、日付が翌日に丸められる可能性がある例です:

    DECLARE @thetime time(7);
    SET @thetime = '23:59:59.9999999';
    SELECT 
      @thetime AS 'time',
      CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';
    

    結果:

    +------------------+---------------------+
    | time             | datetime2(0)        |
    |------------------+---------------------|
    | 23:59:59.9999999 | 1900-01-02 00:00:00 |
    +------------------+---------------------+
    

    例3– CONVERT()を使用した明示的な変換

    これは最初の例と同じですが、今回はCONVERT()を使用します。 CAST()の代わりに関数 。

    DECLARE @thetime time;
    SET @thetime = '23:15:59.004007';
    SELECT 
      @thetime AS 'time',
      CONVERT(datetime2, @thetime) AS 'datetime2';
    

    結果:

    +------------------+-----------------------------+
    | time             | datetime2                   |
    |------------------+-----------------------------|
    | 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |
    +------------------+-----------------------------+
    

    例4–暗黙の変換

    これは同じことを行う例ですが、暗黙的な型変換を使用しています。

    DECLARE @thetime time, @thedatetime2 datetime2;
    SET @thetime = '23:15:59.004007';
    SET @thedatetime2 = @thetime;
    SELECT 
      @thetime AS 'time',
      @thedatetime2 AS 'datetime2';
    

    結果:

    +------------------+-----------------------------+
    | time             | datetime2                   |
    |------------------+-----------------------------|
    | 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |
    +------------------+-----------------------------+
    

    したがって、明示的な変換であるか暗黙的な変換であるかに関係なく、同じ結果が得られます。

    明示的に変換するために変換関数を使用していないため、これは暗黙的な変換です。あるデータ型の変数から別のデータ型の変数に値を割り当てるだけです。この場合、時間を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 datetime2の値 変数。

    例5–日付を変更する

    日付を変更する必要がある場合(ただし、同じ時刻を維持する必要がある場合)は、DATEADD()を使用できます。 働き。

    DECLARE @thetime time, @thedatetime2 datetime2;
    SET @thetime = '23:15:59.004007';
    SET @thedatetime2 = @thetime;
    SET @thedatetime2 = DATEADD(year, 120, @thedatetime2);
    SELECT 
      @thetime AS 'time',
      @thedatetime2 AS 'datetime2';
    

    結果:

    +------------------+-----------------------------+
    | time             | datetime2                   |
    |------------------+-----------------------------|
    | 23:15:59.0040070 | 2020-01-01 23:15:59.0040070 |
    +------------------+-----------------------------+
    

    この場合、年の値に120を追加すると、2020年になります。


    1. MySQLをSQliteに変換する

    2. SQLServer診断を実行するための4つのヒント

    3. 陳記法

    4. T-SQL:重複するすべての行を削除しますが、1つは保持します