質問

SQL Server 2005テーブルには、従業員が使用されている月数を保持する列があります。

従業員が従事していた日付もあるので、「months_in_service」列を計算済みの列にしたいです。

今私が使用する場合 DATEDIFF(month,[DateEngaged],GETDATE()) サービスコンピューター列の数ヶ月の式として、結果は時々正しいものであり、時には正しくありません。

デートエンゲージ値と現在の日付の間に月数を得るためのより良い信頼できる方法は何でしょうか?計算された列でどの式を使用する必要がありますか?

役に立ちましたか?

解決

のようなもの(1と0を交換する必要があるかもしれません、テストされていない)

datediff(month,[DateEngaged],getdate()) +
 CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END

毎日の月の境界例:毎月1日の00:00時間、月の記念日ではありません

編集:OPのコメントを見た後、開始日>終了日の場合は1を差し引く必要があります

DATEDIFF (month, DateEngaged, getdate()) -
 CASE
   WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
 END

したがって、12月20日から1月13日に、Datediffは1、その後20> 13を与えます。

他のヒント

GBNと同じアプローチですが、キーストロークが少ない:-)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) +
    CASE 
        WHEN DAY(DateEngaged) < DAY(GETDATE())
        THEN 1 
        ELSE 0 
    END

多分あなたは次のようなものが欲しいです:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))

その月が30日間の意味であると推測する場合は、ヴェールを回ることもできます

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top