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

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

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

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

    ただし、日付の場合があります smalldatetime 変換が失敗する可能性があります。特に、日付 値がsmalldatetimeでサポートされている範囲外です その後、エラーで失敗します。

    いずれにせよ、以下はこれら2つのデータ型間の変換の例です。

    例1-暗黙の変換

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

    DECLARE @thedate date, @thesmalldatetime smalldatetime
    SET @thedate = '2020-12-01'
    SET @thesmalldatetime = @thedate
    SELECT 
      @thedate AS 'date',
      @thesmalldatetime AS 'smalldatetime';
    

    結果:

    +------------+---------------------+
    | date       | smalldatetime       |
    |------------+---------------------|
    | 2020-12-01 | 2020-12-01 00:00:00 |
    +------------+---------------------+
    
    >

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

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

    日付の間で変換する場合 およびsmalldatetime 、時間コンポーネントは00:00:00に設定されます 。これにより、分単位の精度が得られます。

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

    もちろん、単に日付のみの値を smalldatetime に割り当てた場合でも、この結果が得られます。 変換を実行せずに:

    DECLARE @thesmalldatetime smalldatetime = '2020-12-01'
    SELECT @thesmalldatetime AS 'smalldatetime';
    

    結果:

    +---------------------+
    | smalldatetime       |
    |---------------------|
    | 2020-12-01 00:00:00 |
    +---------------------+
    

    例2–時間を変更する

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

    DECLARE @thedate date, @thesmalldatetime smalldatetime
    SET @thedate = '2020-12-01'
    SET @thesmalldatetime = @thedate
    SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)
    SELECT 
      @thedate AS 'date',
      @thesmalldatetime AS 'smalldatetime';
    

    結果:

    +------------+---------------------+
    | date       | smalldatetime       |
    |------------+---------------------|
    | 2020-12-01 | 2020-12-01 07:00:00 |
    +------------+---------------------+
    
    >

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

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

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

    結果:

    +------------+---------------------+
    | date       | smalldatetime       |
    |------------+---------------------|
    | 2020-12-01 | 2020-12-01 00:00:00 |
    +------------+---------------------+
    
    >

    暗黙の変換と同じ結果。

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

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

    結果:

    +------------+---------------------+
    | date       | smalldatetime       |
    |------------+---------------------|
    | 2020-12-01 | 2020-12-01 07:00:00 |
    +------------+---------------------+
    
    >

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

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

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

    結果:

    +------------+---------------------+
    | date       | smalldatetime       |
    |------------+---------------------|
    | 2020-12-01 | 2020-12-01 00:00:00 |
    +------------+---------------------+
    
    >

    そして時間を調整する:

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

    結果:

    +------------+---------------------+
    | date       | smalldatetime       |
    |------------+---------------------|
    | 2020-12-01 | 2020-12-01 07:00:00 |
    +------------+---------------------+
    
    >

    例5–範囲外エラー

    前述のように、日付が smalldatetimeでサポートされている範囲外の場合 データ型の場合、エラーが発生します。

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

    結果:

    The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
    

    smalldatetime データ型は、1900-01-01から2079-06-06までの日付範囲のみをサポートします。

    また、 smalldatetime データ型は00:00:00から23:59:59までの時間範囲のみをサポートしているため、その範囲外の値を使用しようとすると(たとえば、より高い精度で)エラーが発生します。

    例:

    DECLARE @thedate date
    SET @thedate = '2020-12-01'
    SELECT 
      @thedate AS 'date',
      DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
    

    結果:

    The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
    

    ただし、この場合、変換中のエラーではなく、実際にはDATEADD()の使用中のエラーです。 関数(この関数では、特定の日付部分を smalldatetimeで使用することはできません。 データ型)。


    1. SQLクエリを使用してコンマ区切りのリストを作成するにはどうすればよいですか?

    2. SQL Server(T-SQL)のHTMLテーブルとしての電子メールクエリ結果

    3. SQLServerのデッドロックの構造とそれらを回避するための最良の方法

    4. PostgreSQLのフォールトトレランスの進化:同期コミット