web-dev-qa-db-ja.com

TSQL日時ISO 8601

ISO 8601日付形式を必要とする仕様が与えられましたが、誰もが変換コードを知っているか、これら2つの例を取得する方法を知っていますか。

ISO 8601 Extended Date 2000-01-14T13:42Z 
ISO 8601 Basic Date 20090123T105321Z
55
MartGriff

SQL Serverで日付を処理する場合、言語や文化の設定に関係なく機能するため、ISO-8601形式がおそらく最適な方法です。

SQL Serverテーブルにデータを挿入するために、変換コードなど何も必要ありません-日付をリテラル文字列として指定するだけです

INSERT INTO MyTable(DateColumn) VALUES('20090430 12:34:56.790')

これで完了です。

SELECTで日付列をISO-8601形式に変換する必要がある場合は、変換コード126または127(タイムゾーン情報付き)を使用してISO形式を実現できます。

SELECT CONVERT(VARCHAR(33), DateColumn, 126) FROM MyTable

あなたに与える必要があります:

2009-04-30T12:34:56.790
84
marc_s

この

SELECT CONVERT(NVARCHAR(30), GETDATE(), 126)

これを生成します

2009-05-01T14:18:12.430

これについての詳細は [〜#〜] msdn [〜#〜] にあります。

20
Cyberherbalist

末尾のZを含むISO8601形式で日付を出力するだけで、少なくともSQL Server 2012を使用している場合は、FORMATを使用できます。

SELECT FORMAT(GetUtcDate(),'yyyy-MM-ddTHH:mm:ssZ')

これにより、次のようなものが得られます。

2016-02-18T21:34:14Z

12
John P

まあ、いいえ!!!書式設定された日付をSQL Serverに保存すると、怪我の世界を求めています。常に日付と時刻、およびSQL Serverの「日付/時刻」データ型(DATETIME、DATE、TIME、DATETIME2など)のいずれかを保存します。フロントエンドコードで表示方法を解決し、ファイルを作成するステージングテーブルを作成するときにフォーマットされた日付のみを保存します。 SQL ServerのISO日付/時刻形式を絶対に表示する必要がある場合は、表示時にのみ表示してください。強調することはできません...書式設定された日付/時刻をSQL Serverに保存しないでください。

{編集}。これには多くの理由がありますが、最も明白なのは、ニースISO形式(並べ替え可能)であっても、将来のすべての日付の計算と検索(たとえば、特定の月のすべての行の検索)には少なくとも暗黙の変換(余分な時間がかかります)で、保存されている書式設定された日付が現在必要な形式でない場合、まず日付に変換してから、必要な形式に変換する必要があります。

同じことがフロントエンドコードにも当てはまります。書式設定された日付(テキスト)を保存する場合、Windowsまたはアプリで定義されたローカル日付形式を表示するには、同じ回転が必要です。

私の推奨事項は、日付/時刻を常にDATETIMEまたは他の一時データ型として保存し、表示時刻でのみ日付をフォーマットすることです。

6
Jeff Moden

ISO日付について言えば、技術的には2つのオプションがあります。

一般的に、Date values alone OR日付をニュートラルな方法で永続化することを検討している場合、Microsoftはymdまたはy-m-d。どちらも有効なISO形式です。

フォーム '2007-02-12'は、DATE、DATETIME2、およびDATETIMEOFFSETのデータ型についてのみ、言語に依存しないと見なされることに注意してください。

このため、最も安全な方法は、always neturalymd形式に基づいて永続化/フィルタリングすることです。

コード:

select convert(char(10), getdate(), 126) -- ISO YYYY-MM-DD
select convert(char(8), getdate(), 112) -- ISO YYYYMMDD (safest)
0
pim