パッケージ変数 (User::LastUpdate) に対してテーブルの日付フィールド (MODIFYDATE) をチェックして、データベースから一連のレコードを取得する SSIS パッケージを作成しようとしています。MODIFYDATE が LastUpdate 以降のレコードが選択されます。
DateDiff とビットを返す UDF を使用して (どちらも間隔として Second を使用しています)、この 2 つの方法を試しましたが、両方の方法で同じ問題に遭遇しました。日付の一致は 2 日ずれているようです。
LastUpdate が 2013 年 1 月 22 日 0:00 に設定されている場合、2 つのレコードが返されます。ただし、LastUpdate が 2013 年 1 月 20 日 12:00 までに設定されない限り、どちらも返されません。それより前に設定すると、両方とも返されます。それ以降の場合、どちらも返されません。
行は、SSIS パッケージの OLE DB ソース コンポーネントに取り込まれています。クエリ ビルダーにアクセスしてそこからクエリを実行し、日付を手動で指定すると、正しい行が返されます。ブレークポイントを挿入し、行がプルされたときに LastUpdate に正しい日付が含まれていることを確認しました (LastUpdate の値は、パッケージの前のストアド プロシージャによって提供されます)。
現在のクエリは次のとおりです。
SELECT ACTIVITIES.*
FROM ACTIVITIES LEFT OUTER JOIN
ArchivedEvents ON ACTIVITIES.FBC_EVENTSID =
ArchivedEvents.FBC_EVENTSID
WHERE (dbo.IsDateInOrder(?, ACTIVITIES.MODIFYDATE) = 1) OR
(dbo.IsDateInOrder(?, ArchivedEvents.MODIFYDATE) = 1)
そして、私が作成した関数
CREATE FUNCTION [dbo].[IsDateInOrder]
(
@Date1 DateTime,
@Date2 DateTime
)
RETURNS bit
AS
BEGIN
DECLARE @retval bit
if DATEDIFF(s, @Date1, @Date2) >= 0
SET @retval = 1
else
SET @retval = 0
RETURN @retval
END
GO