0

パイロットの生年月日に従ってタイムスパンが計算される状況があります。

パイロットは、6か月ごとに非常に多くの時間を取得する必要があります。1月から6月、7月から12月とは限らないのが気になりますが、どうやら生年月日までにこのようなことをしなければならないようです。

参照表は次のとおりです。

ここに画像の説明を入力

ここで、各パイロットの 2 つの期間に基づいて、すべての飛行時間を計算できるようにする必要があります。たとえば、私の誕生日は 10 月 23 日です。これは、私の最初の 6 か月間の期間が 11 月 1 日から 4 月末 (翌年の) までであることを意味します。特定の期間の飛行時間を簡単に (またはできるだけ簡単に) 計算できる参照テーブルを作成する方法についてのアイデアを探しています。

ここに私がこれまでに持っているものがあります:

ここに画像の説明を入力

ここで、birthMonth と startYear を合わせて複合主キーにします。startYear は、期間の開始年です。

birthMonth は NVARCHAR(50)、startYear は Int、残りは Dates です。

私のパイロットテーブルには生年月日が完全な日付としてあり、フライトマネージャーはstartYearを選択できます。どう思いますか?生まれた月と年を同じフィールドに結合する必要がありますか? 特定のパイロットの半年ごとおよび年ごとの飛行時間を簡単に合計できるスキーマを作成しようとしています。たぶん、日付を分割して年を含まないようにしてから、動的に追加できますか? この設計には、私が考えていない欠陥があると思います。

編集:ここに私が現在取り組んでいるすべてのテーブルがあります: ここに画像の説明を入力

4

1 に答える 1

2

テーブルは本当に必要ですか?

declare @birthday datetime = '2012-01-09'

SELECT  DATEADD(dd,-(DAY(DATEADD(m,1,@birthday))-1),DATEADD(m,1,@birthday)) firstSixMonthStart,
        DATEADD(dd, -DAY(DATEADD(m,1,@birthday)), DATEADD(m,7,@birthday)) firstSixMonthEnd,
        DATEADD(dd,-(DAY(DATEADD(m,1,@birthday))-1),DATEADD(m,7,@birthday)) secondSexMonthStart,
        DATEADD(dd, -DAY(DATEADD(m,1,@birthday)), DATEADD(m,13,@birthday)) secondSixMonthEnd

firstSixMonthStart      firstSixMonthEnd        secondSexMonthStart     secondSixMonthEnd
----------------------- ----------------------- ----------------------- -----------------------
2012-02-01 00:00:00.000 2012-07-31 00:00:00.000 2012-08-01 00:00:00.000 2013-01-31 00:00:00.000`
于 2012-07-19T15:55:09.680 に答える