2013、2012 などを含む年の列があります。1 ~ 12 を表示する月の列と、1 ~ 31 を含む日の列があります。それらを連結して実際の日付としてキャストする選択を実行する必要がありますが、これについてどうすればよいかわかりません。誰でも入力を提供できますか?
6 に答える
SQL Server 2008 以降の場合:
SELECT CONVERT(DATE,CAST([Year] AS VARCHAR(4))+'-'+
CAST([Month] AS VARCHAR(2))+'-'+
CAST([Day] AS VARCHAR(2)))
SQL Server 2005 の場合:
SELECT CONVERT(DATETIME,CAST([Year] AS VARCHAR(4))+
RIGHT('00'+CAST([Month] AS VARCHAR(2)),2)+
RIGHT('00'+CAST([Day] AS VARCHAR(2)),2))
SQL Server 2012 では、文字列の連結や複雑な計算は避けたほうがよいでしょう。これらは一見あなたのためだけに関数を作成しているように見えます。
SELECT DATEFROMPARTS(2013, 8, 19);
もちろん、そもそもデータを間違って保存すると問題が発生する可能性があります。たとえば、y = 2013、m = 2、d = 31 がテーブルに含まれないようにする制約は何ですか? あなたはそれを でラップできると思うでしょうがTRY_CONVERT()
、それほど多くはありません:
SELECT TRY_CONVERT(DATE, DATEFROMPARTS(2013, 2, 31));
エラー:
メッセージ 289、レベル 16、状態 1、行 3
データ型の日付を作成できません。引数の一部に無効な値が含まれています。
したがって、これらの 3 つの列に不正なデータが入るのを防ぐには、上記の面倒な方法のいずれかをチェック制約またはトリガーで使用する必要があります...
...また...
...どのバージョンでも、最初にテーブルを修正して日付 (または日時) を保存できます。自動検証のすべての利点と、関連のない 3 つの個別の整数では得られない固有の日付/時刻機能が得られます。有効な日付を形成するために個々の部分に依存しようとするよりも、日付であることが保証されている値から (計算列、ビュー、またはクエリ時に) 必要なときに部分を個別に引き出す方がはるかに優れています。 ..
SELECT CAST(STR(10000 * Year + 100 * Month + Day) AS DATETIME)
もう1つ、さまざまなアプローチのリストを埋めるだけです:
select
dateadd(d, t.d-1, dateadd(m, t.m-1, dateadd(yy, t.y-1900, 0)))
from (values
(2011, 10, 26)
,(2012, 1, 5)
,(2013, 7, 15)
) t(y, m, d)
列が文字列の場合、このようなことを試すことができます
Select Cast([year] + '-' + [month] + '-' + [day] as datetime)
From yourTable
それらが数値の場合、連結する前に各列を varchar にキャストする必要があります。そうしないと、ファンキーなものになってしまいます
Convert
機能を使用する
Select Convert(datetime ,YEAR + '/' + MM + '/' + DAY)
YEAR
年列、MM
月、日の列に置き換えDAY
ます。連結して日付文字列を作成します