web-dev-qa-db-ja.com

SQLServerの日付形式DD-Mon-YY

アプリをOracle11からSQLServer2014に移行する作業を行っています。Javaコードには、DD-Mon-YY形式の日付を予期する場所がたくさんあります。できませんでした。変換された文字列に「-」を詰め込まずにこれを行うための、convertまたはその他の組み込み関数を使用したオプションを見つけます。

今日は次のようなものを使用しています

upper((((CONVERT(NVARCHAR, Dt_Column, 113), 3, 1, '-'), 7, 3, '-'),1,18))

数十万行をロードする同じビューの複数の列にこれを使用しています。パフォーマンスに影響を与える可能性があると思われます。任意の入力/考えが役立ちます。前もって感謝します。

4
rsreji

これにより、目的の効果が得られます。

SELECT REPLACE(CONVERT(NVARCHAR, Dt_Column, 106), ' ', '-')

CONVERTのスタイル106は、日付をdd mon yyyyの形式で提供します。これにより、スペースをダッシュ​​に置き換えることができます。

更新

形式に時間も含める必要があるという追加情報に基づいて、FORMATを使用してみてください。

SELECT FORMAT(SYSDATETIME(), 'dd-MMM-yyyy hh:mm:ss')

覚えておくべきことの1つは、FORMATはCLRに依存しているため、パフォーマンスへの影響を測定する必要があるということです。ただし、データセットでは、FORMATへの1回の呼び出しは、複数のネイティブ関数呼び出しと同等であるか、パフォーマンスが向上する可能性があります。

いずれの場合も、正しい形式で日付を取得することによる影響が大きすぎる場合は、SQL Serverで永続化された計算列を使用して、形式化された日付を保持できます。 Javaコードで列参照の名前を変更したくない場合は、ソース列の名前を変更し、新しい計算列にソース列の元の名前を付けることができます。

https://docs.Microsoft.com/en-us/sql/t-sql/statements/alter-table-computed-column-definition-transact-sql を参照してください。

[PERSISTED]は、計算された値をテーブルに物理的に格納し、計算された列が依存する他の列が更新されたときに値を更新します

6
Joey

Joeyの回答を出発点として使用し、これを日付と時刻のスタイルセクションの情報と組み合わせるdocs.Microsoft.comCAST and CONVERT(Transact-SQL)ページで、CONVERT(NVARCHAR、@ Value、6)は2桁の年を出力しますあなたが探していた。

DECLARE     @Now AS DATETIME = GETDATE()

SELECT          @Now AS '@Now'
            ,   REPLACE(CONVERT(NVARCHAR, @Now, 6), ' ', '-') AS 'Abbr@Now'

/***********************************************************************

    Results:

        @Now                    Abbr@Now
        ----------------------- ---------
        2017-12-22 10:08:33.443 22-Dec-17

        (1 row(s) affected)

 ***********************************************************************/

CONVERT()を使用した追加のDATETIMEフォーマットは次の場所にあります: https://docs.Microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

これがお役に立てば幸いです。

0
ClockEndGooner