2017-04-06 8 views
0

を評価支援が必要:は、私は少し下に示す文を評価混乱していたSQL文

AND getdate() BETWEEN fti.effectivestart AND ISNULL(fti.effectiveend, '2050-01-01') 

私は列に日付範囲を取得したいときはいつでも従業員のStartDate言って、私はこのような何かをするだろう。

AND StartDate BETWEEN fti.effectivestart AND ISNULL(fti.effectiveend, '2050-01-01') 

私はその違いを理解してくれますか?

ありがとうございます。

+0

に対するあなたのStartDateの値を確認する一方、第一文が検証され

とあなたには何が分かりませんか? –

+0

あなたもあなたの後ろのことを述べているかもしれません..従業員のマスターと求職履歴を実際に見ている構造を見てください – maSTAShuFu

+0

こんにちはTim/rhian、 最初の声明がどのように評価されているかはわかりませんか? 2番目の声明が得られます。つまり、基本的に開始日列のレコードがfti.effectivestartとisnullの間に返されます(fti.effectiveend、 '2050-01-01') –

答えて

0

2文の間の唯一の違いは、1つの現在の日付(getdate())に対して比較され、他方は、特定の日付(StartDate)と比較することです。実行(今)の現在の日付がbetween fti.effectivestart AND ISNULL(fti.effectiveend, '2050-01-01')

ある場合は、2番目は、実際の問題とは何の条件between fti.effectivestart AND ISNULL(fti.effectiveend, '2050-01-01')

0

両方のステートメントは、ある時点で有効なレコードを返しています。

最初のものが現在の時刻で評価されます。それはgetdate()が返すものです。

StartDateの2番目の値は、行ごとに異なる場合があります。

これはあなたが混乱していることですか?

カップルノート:前者はANSI標準であるため、

  • coalesce()は、通常は(常にではない)isnull()に好適です。
  • 効果と終了日がの日付(時間コンポーネントなし)の場合は、おそらくcast(getdate() as date)が必要です。
  • betweenに日付を使用する場合は注意が必要です。私はテーブルがセットアップされているので、これは期待どおりに動作します。
+0

こんにちはGordonありがとうございます。はい、正確には、SQL文を実行しようとしていましたが、重複したレコードが返されていました。私の友人は、AND getdate()とftp.effectivestartを使用するように提案しました。isnull(fti.effectiveend、 '2050-01-01') しかし、私はそれを評価する方法としては不明でした。 –

+0

@JackJames。 。 。 'between 'は日付を比較する間違った方法なので、レコードが重複している可能性があります。サンプルデータで*別の質問をしたり、重複を生成するサンプルデータを表示することができます。 –

+0

@GordonLinoffは間に日付を比較する間違った方法です。精巧に扱う? – artm

関連する問題