2017-04-19 11 views
-2

を通じて単一のエントリから複数の値を選択することは、私は任意のライセンス(特定日以内に期限切れに聞かせてので、従業員を選択するにはどうすればよい以下の情報私はテーブルを持っているフィルタリング

(社員、DriverLicenseExpiryDate、AutoInsuranceExpiryDate、TWICCardExpiryDate)

が含まれています30日くらい)?私はこの

EmployeeID ExpiryDate LicenseType 

10001  2017-04-31 Driver license 
10002  2017-04-21 Driver license 
10002  2017-05-11 Auto insurance 
10003  2017-04-20 Driver license 
10003  2017-05-01 TWIC card 

のような結果を得るためにしようとしています

これは可能ですか? ありがとう!

+0

'select * from table where expirydate <= now()+ 30'のようにDBMSの正しい構文に置き換えてください –

+0

これは従業員を1回選択しませんか? –

+0

これは、期限切れの日付が今の+ 30日未満のすべての従業員を選択します。 –

答えて

0

あなたはMSSQLを使用している場合は、このために最適ですBETWEEN演算子必要があります:あなたは、スクリプトを使用して、この使用して変数を簡素化することができますすることが可能な環境での作業の贅沢を持っている場合

SELECT EmployeeID, DriverLicenseExpiryDate AS ExpiryDate, 'Driver License' AS LicenseType 
    FROM YourTable 
    WHERE DriverLicenseExpiryDate BETWEEN GETDATE() AND GETDATE() + 30 
UNION SELECT EmployeeID, AutoInsuranceExpiryDate AS ExpiryDate, 'Auto Insurance' AS LicenseType 
    FROM YourTable 
    WHERE AutoInsuranceExpiryDate BETWEEN GETDATE() AND GETDATE() + 30 
UNION SELECT EmployeeID, TWICCardExpiryDate AS ExpiryDate, 'TWIC Card' AS LicenseType 
    FROM YourTable 
    WHERE TWICCardExpiryDate BETWEEN GETDATE() AND GETDATE() + 30 

を:

DECLARE @startDate AS DATE = GETDATE(); 
DECLARE @endDate AS DATE = GETDATE() + 10; 

SELECT EmployeeID, DriverLicenseExpiryDate AS ExpiryDate, 'Driver License' AS LicenseType 
    FROM YourTable 
    WHERE DriverLicenseExpiryDate BETWEEN @startDate AND @endDate 
UNION SELECT EmployeeID, AutoInsuranceExpiryDate AS ExpiryDate, 'Auto Insurance' AS LicenseType 
    FROM YourTable 
    WHERE AutoInsuranceExpiryDate BETWEEN @startDate AND @endDate 
UNION SELECT EmployeeID, TWICCardExpiryDate AS ExpiryDate, 'TWIC Card' AS LicenseType 
    FROM YourTable 
    WHERE TWICCardExpiryDate BETWEEN @startDate AND @endDate; 
+0

これは、適切なフィルタを持つすべての従業員を選択しますが、複数のライセンスが期限切れの従業員に対して複数の行を投稿しようとしています。 –

+0

@ jchien66更新情報 – krowe

+0

を参照してください。私は複数の組合選択を考えていましたが、別の解決策があるかもしれないと考えました。詳細なソリューションを提供していただきありがとうございます! –

0

私はouter applyを使用してデータをアンピボットし、その後conditioonを適用する:

select t.EmployeeId, v.LicenceType, v.ExpiryDate 
from t cross apply 
    (values ('Driver License', DriverLicenseExpiryDate), 
      ('Auto Insurance', AutoInsuranceExpiryDate), 
      ('TWIC Card', TWICCardExpiryDat) 
    ) v(LicenceType, ExpiryDate) 
where v.ExpiryDate >= getdate() and 
     v.ExpiryDate < dateadd(day, 30, getdate(); 

これは、元のテーブルが一度だけ読み取られるため、データをピボット解除する最も効率的な方法です。さらに、日付の条件は一度だけ表現されます。

また、日付の算術を詳しく調べることをお勧めします。 getdate()には時間的な要素があるので、あなたが望むものと正確に一致しない可能性があります。

関連する問題