4

次の式を持つ 2 つの計算列 (MonthsInService と YearsInService) があります。

勤続月数 =(datediff(month,[DateEngaged],getdate()))

勤続年数 =(datediff(month,[DateEngaged],getdate())/(12))

たとえば、DateEngaged = 2012-April-09 で getdate() が 2013-April-08 の場合、MontersInService は 12 を返し、YearsInService は 1 を返します。

従業員の最初の記念日まであと 1 日あるため、私のアプリケーションでは YearsInService をゼロにする必要があります。

月の日数はさまざまであるため、 MonthsInService 列を最適に処理する方法さえわかりません。

4

3 に答える 3

5

残念ながら、2 つの日付の違いに関する通常の人間の直感ではなく、要素の遷移DATEDIFFの数を計算します (例:年の差があると言う人は多くありませんが、1 です)。DATEDIFF(year,'20121231','20130101')

私が使用するソリューションは少し反復的ですが、別の関数を必要とせず、うるう年などを常に正しく取得します。

declare @T table (
    DateEngaged datetime not null,
    MonthsInService as CASE
        WHEN DATEADD(month,DATEDIFF(month,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
            THEN DATEDIFF(month,DateEngaged,GETDATE()) - 1
            ELSE DATEDIFF(month,DateEngaged,GETDATE())
        END,
    YearsInService as CASE
        WHEN DATEADD(year,DATEDIFF(year,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
            THEN DATEDIFF(year,DateEngaged,GETDATE()) - 1
            ELSE DATEDIFF(year,DateEngaged,GETDATE())
        END
)

insert into @T (DateEngaged) values ('20120409'),('20120408')

select * from @T

プロデュース:

DateEngaged             MonthsInService YearsInService
----------------------- --------------- --------------
2012-04-09 00:00:00.000 11              0
2012-04-08 00:00:00.000 12              1

これは、「 によって生成された単純な回答を使用するとDATEDIFF、1 だけ高すぎる回答が与えられるか?」と尋ねることによって機能します。- もしそうなら、それが与える答えから 1 を引くだけです。DATEDIFF1 だけオーバーする必要があります。

于 2013-04-08T13:39:12.553 に答える