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 上尝试它时,它只显示当前日期和前 16 天,即使有些日子在 HOLIDAY 和EMPLOG表中。

有人能帮助我吗?谢谢!

4

3 回答 3

1

尝试转换您的 Date 变量 - 您将 GetDate 与不一定具有相同时间的日期进行比较:

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

用你所有的日期包装它,它应该可以工作。看看这个SQL Fiddle。在这个例子中,我只添加了 1 个假期,1/21/2013 (MLK​​)。

编辑 -

convert(varchar, getdate(), 101)由于SQL Server 2005 不支持该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 设为“今天午夜”,而不是“今天与当前时间”。这样它会更好地加入你的桌子。

假设:假期表中的日期存储为“午夜”

于 2013-01-29T03:25:29.977 回答
0

2008 年和 2005 年的日期之间似乎存在一些差异。您必须设置数据库兼容性。请参阅以下文章:

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

于 2013-01-29T03:45:51.237 回答