[英]Query in SQL Server 2008 not working in SQL Server 2005
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天。
有人能幫助我嗎? 謝謝!
嘗試轉換Date變量-您正在將GetDate與不一定具有相同時間的Date進行比較:
left JOIN Holiday ON CAST(AllDates as Date) = CAST(Holiday.HolDate as Date)
將所有日期都括起來,應該可以使用。 看看這個SQL Fiddle 。 在此示例中,我僅添加了1個假期,2013年1月21日(MLK)。
編輯-
嘗試使用convert(varchar, getdate(), 101)
來對date
進行CAST
,因為SQL Server 2005不支持Date
類型。
這是更新的SQL:
left JOIN Holiday ON convert(varchar, AllDates, 101) = convert(varchar, Holiday.HolDate, 101)
在所有日期轉換上執行此操作。 這是更新的小提琴 。
感謝@ user148298指出這一點。
祝好運。
嘗試將@MyDate初始化更改為:
set @MyDate = Convert(DATETIME(CONVERT(VARCHAR(10), GETDATE(), 121) + ' 00:00:00', 121);
說明:這樣,您將@MyDate設置為“今天午夜”,而不是“今天與當前時間”。 這樣,最好將其與表連接。
假設:假期表中的日期存儲為“午夜”
2008年和2005年之間似乎存在一些差異。您必須設置數據庫兼容性。 請參閱以下文章:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.