0
DECLARE @MyDate Datetime 
set @MyDate = GETDATE();
WITH cte AS
 (SELECT @MyDate AS AllDates,
       1 AS [count_all_days],
       CASE WHEN DATENAME(dw, DATEADD(dd, - 1, @MyDate)) IN ('Saturday', 'Sunday') THEN 1 ELSE 0 END AS [count_week_days]
UNION ALL
SELECT DATEADD(dd, - [count_all_days], @MyDate), 
       [count_all_days] + 1,
       CASE WHEN DATENAME(dw, DATEADD(dd, - [count_all_days], @MyDate)) IN ('Saturday', 'Sunday') THEN [count_week_days] + 1 ELSE [count_week_days] 
       END
FROM cte
WHERE [count_all_days] - [count_week_days] < 16 
)

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, AllDates))
FROM cte left join EmpLog ON AllDates = EmpLog.Date 
           left JOIN Holiday ON AllDates = Holiday.HolDate
WHERE DATENAME(dw, AllDates) NOT IN ('Saturday', 'Sunday')AND AllDates NOT IN (Select EmpLog.Date from EmpLog where EmpLog.EmpID = 1)and Holiday.HolDate IS NULL

この SQL クエリは、現在の日付と過去 16 日間を表示します。これらの日付は、HOLIDAY テーブルおよびテーブル内の既存の日付と等しくありませんEMPLOG

私の問題は、このクエリが SQL Server 2008 でうまく機能することですが、SQL Server 2005 で試してみると、一部の日が HOLIDAY とEMPLOGテーブルに含まれていても、現在の日付と過去 16 日間しか表示されません。

誰か助けてくれませんか?ありがとう!

4

3 に答える 3

1

Date 変数をキャストしてみてください。GetDate を、必ずしも同じ時刻ではない Dates と比較しています。

left JOIN Holiday ON CAST(AllDates as Date) =  CAST(Holiday.HolDate as Date)

それをすべての日付でラップすると、うまくいくはずです。このSQL Fiddleを見てください。この例では、2013 年 1 月 21 日 (MLK​​) の 1 つの休日のみを追加しました。

編集 -

SQL Server 2005 では型がサポートされていないため、を使用convert(varchar, getdate(), 101)CASTてみてください。dateDate

更新された SQL は次のとおりです。

left JOIN Holiday ON convert(varchar, AllDates, 101) =  convert(varchar, Holiday.HolDate, 101)

すべての日付変換でそれを行います。これが更新されたFiddleです。

これを指摘してくれてありがとう@ user148298。

幸運を。

于 2013-01-29T03:47:47.913 に答える
0

@MyDate の初期化を次のように変更してみてください。

set @MyDate = Convert(DATETIME(CONVERT(VARCHAR(10), GETDATE(), 121) + ' 00:00:00', 121);

説明: これを行うことで、@MyDate を「今日の現在時刻」ではなく「今日の午前 0 時」にします。そうすれば、テーブルとの結合が改善されます。

仮定: 休日テーブルの日付は「午前 0 時」として保存されます

于 2013-01-29T03:25:29.977 に答える
0

2008 年と 2005 年の日付にはいくつかの違いがあるようです。データベースの互換性を設定する必要があります。次の記事を参照してください。

http://msdn.microsoft.com/en-us/library/bb510680.aspx

于 2013-01-29T03:45:51.237 に答える