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

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

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

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

    datetime2 データ型は基本的に日時の拡張です データ・タイプ。日付範囲が大きく、デフォルトの分数精度が大きく、オプションでユーザー指定の精度があります。

    いずれの場合も、変換プロセスはデータ型に関係なくまったく同じです。唯一の違いは、日付の間で利用できる情報の量です。 、日時 およびdatetime2

    例1-暗黙の変換

    日付間の暗黙的な変換の例を次に示します。 およびdatetime2

    DECLARE @thedate date, @thedatetime2 datetime2
    SET @thedate = '2020-12-01'
    SET @thedatetime2 = @thedate
    SELECT 
      @thedate AS 'date',
      @thedatetime2 AS 'datetime2';
    

    結果:

    +------------+-----------------------------+
    | date       | datetime2                   |
    |------------+-----------------------------|
    | 2020-12-01 | 2020-12-01 00:00:00.0000000 |
    +------------+-----------------------------+
    

    明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、日付を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します datetime2の値 変数。

    日付がわかります 変数には日付情報のみが含まれますが、 datetime2 変数には、日付と時刻の両方の情報が含まれます。

    さらに、 datetimeに変換した場合よりも多くの時間情報を取得できます。 データ型。

    日付の間で変換する場合 およびdatetime2 デフォルトの精度(7)を使用すると、時間コンポーネントは00:00:00.0000000に設定されます。 (00:00:00.000と比較して 日時の場合 )。必要に応じて、精度を下げることができます(以下を参照)。精度を下げると、値を格納するために必要なスペースの量も減らすことができます。

    時間コンポーネントがすべてゼロである理由は、日付値に時間情報が含まれていないため、SQL Serverが必要な時間を知る方法がないためです(存在する場合)。

    例2–時間を変更する

    時刻を指定する必要がある場合(ただし、同じ日付を維持する必要がある場合)は、DATEADD()を使用できます。 まさにそれを行うための機能。

    DECLARE @thedate date, @thedatetime2 datetime2
    SET @thedate = '2020-12-01'
    SET @thedatetime2 = @thedate
    SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
    SELECT 
      @thedate AS 'date',
      @thedatetime2 AS 'datetime2';
    

    結果:

    +------------+-----------------------------+
    | date       | datetime2                   |
    |------------+-----------------------------|
    | 2020-12-01 | 2020-12-01 08:00:00.0000000 |
    +------------+-----------------------------+
    

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

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

    DECLARE @thedate date
    SET @thedate = '2020-12-01'
    SELECT 
      @thedate AS 'date',
      CAST(@thedate AS datetime2) AS 'datetime2';
    

    結果:

    +------------+-----------------------------+
    | date       | datetime2                   |
    |------------+-----------------------------|
    | 2020-12-01 | 2020-12-01 00:00:00.0000000 |
    +------------+-----------------------------+
    

    したがって、暗黙の変換と同じ結果が得られます。

    次のように時間を調整することもできます:

    DECLARE @thedate date
    SET @thedate = '2020-12-01'
    SELECT 
      @thedate AS 'date',
      DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
    

    結果:

    +------------+-----------------------------+
    | date       | datetime2                   |
    |------------+-----------------------------|
    | 2020-12-01 | 2020-12-01 08:00:00.0000000 |
    +------------+-----------------------------+
    

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

    CONVERT()を使用した明示的な変換の例を次に示します。 CAST()の代わりに関数 。

    DECLARE @thedate date
    SET @thedate = '2020-12-01'
    SELECT 
      @thedate AS 'date',
      CONVERT(datetime2, @thedate) AS 'datetime2';
    

    結果:

    +------------+-----------------------------+
    | date       | datetime2                   |
    |------------+-----------------------------|
    | 2020-12-01 | 2020-12-01 00:00:00.0000000 |
    +------------+-----------------------------+
    

    そして時間を調整する:

    DECLARE @thedate date
    SET @thedate = '2020-12-01'
    SELECT 
      @thedate AS 'date',
      DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
    

    結果:

    +------------+-----------------------------+
    | date       | datetime2                   |
    |------------+-----------------------------|
    | 2020-12-01 | 2020-12-01 08:00:00.0000000 |
    +------------+-----------------------------+
    

    例5–精度

    datetime2 データ型を使用すると、精度を指定できます(デフォルトの7まで)。つまり、必要がなければ、7桁全体を使用する必要はありません。

    例:

    DECLARE @thedate date
    SET @thedate = '2020-12-01'
    SELECT 
      @thedate AS 'date',
      CONVERT(datetime2(2), @thedate) AS 'datetime2(2)',
      CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';
    

    結果:

    +------------+------------------------+--------------------------+
    | date       | datetime2(2)           | datetime2(4)             |
    |------------+------------------------+--------------------------|
    | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
    +------------+------------------------+--------------------------+
    

    精度を下げることの利点の1つは、値を格納するために必要なスペースの量も減らすことができることです。特に、3未満の精度の場合は6バイト、精度3または4の場合は7バイト、その他すべての精度には8バイトが必要です。ただし、最初のバイトは精度を格納するために使用されるため、実際の値は、ここに示されているストレージサイズに、精度を格納するための追加の1バイトを加えたものであることに注意してください。


    1. SQLServerでBegin/End BlocksとGoキーワードを使用する必要があるのはいつですか?

    2. PostgreSQLで2つの日付の間の労働時間を計算します

    3. T-SQLを使用してSQLServerインスタンスの非推奨機能を一覧表示する方法

    4. SQLAlchemyを使用したOracleデータベースへの接続