2016-11-02 27 views
1

私はdatazenで作業しており、year列(2015,2016,2003 ...)と四半期(1または2または3または4)の列。私はそれらをデータ型の新しい列datetimeに変換したいと思います。私は少し捜して、別のSOの質問hereを見つけました。SQL Serverでdatetimeに年(aaaa)と四半期(1〜4)を変換する

は、そのページ上の答えは:

Select 
    dateadd(day, -1, dateadd(year, @year - 1900, dateadd(quarter, @qq, 0))) 

が、私はそれが解決策だと思うが、私はそれを理解する難しさを持っていると私は、変数を使用する(可能な場合)したくないのではなく、ただで変換しますクエリ。

+1

あなたの地域では、いつ四半期が変わりますか、毎年同じですか?それは四半期のTSQLの解釈と同じですか? – Jodrell

答えて

4

SQL Serverの2012+では、あなたは、四半期の最初の日を取得するためにdatefromparts()を使用します。奇妙なdateadd()式は年の最初の日を取得するために使用され

select datefromparts(YearColumn, QuarterColumn * 3 - 2, 1) 

+0

これは* 3 -2のシンプルさが好きです。この質問に一致するように列名を編集しました。 – pancho018

+1

答えに本当に感謝します。私はすぐにそれを試してみます。私はServer 2012を使用していますので、私にとって完璧です。 – kokou

0

どうしてですか?

SELECT DATEADD(q, @qq - 1, DATEFROMPARTS(@year, 1, 1)) 
+0

こんにちはJodrell、私もこの1つを試してみます。ありがとうございました – kokou

0

他の質問に対する回答は、異なるデータベースに設定された異なる日付形式の問題を防ぐためのちょっとしたハックです。基本的に、すべてを日付として扱う場合、MANYの異なるフォーマット方法について心配する必要はありません。ここで

は、他の答えはどのように動作するかの内訳です:

dateadd(quarter, @qq, 0) 

それは最初の基準日として0を使用して、四半期のオフに基づいて、日付を作成します。これは、1900年1月1日、1900年4月1日、1900年7月1日、1900年10月1日の4つの値のいずれかを生成します(これはおそらくサーバーの場所に基づいて変化します) 。

dateadd(year, @year-1900, [date from the quarter dateadd function] 

第2部分は最初の部分の日付を取り、1900年からの経過年数を決定し、最初の日付に何年も追加します。使用されている年が2016年の場合、116年が追加されます。これにより、2011年1月1日、2016年4月1日、2016年7月1日、2016年10月1日の4つの値のいずれかが表示されます。

dateadd(day, -1, [date from previous function] 

最後の部分は、各四半期の最初の日を各四半期の最後の日に変換します。これはあなたの答えの必要な部分ではないかもしれません。

@Gordon Linoffが答えたように、より洗練されたアプローチはdatefromparts関数です。これはSQL Server 2012以降でのみ使用できます。

+1

DForck42、あなたの説明は私に多くのことを理解するのを助けます。時間をとって説明してくれてありがとう。 – kokou

関連する問題