2015-05-29 601 views
1

Microsoft Dynamics NAV使用datetimeyyyy-12-31 23:59:59.000來標識年度結算條目。我正在嘗試撰寫一份報告,將帶來我除了這些以外的所有參賽作品。該查詢2014工作正常,如果我明確地使用SQL篩選出任何年份的特定月份,日期和時間

WHERE [Posting Date] <> '2014-12-31 23:59:59.000') 

一個WHERE條款,但我需要查詢到任何一年的工作。我想:

WHERE (DATEPART(mm, [Posting Date]) <> 12) AND 
     (DATEPART(dd, [Posting Date]) <> 31) AND 
     (DATEPART(hh, [Posting Date]) <> 23) AND 
     (DATEPART(mi, [Posting Date]) <> 59) AND 
     (DATEPART(ss, [Posting Date]) <> 59) 

但是過濾掉了,這是在December或曾有31一天的23一個小時的一切,等...

是否有篩選定日期時間的簡單方法,但任何一年?

回答

1

可能是這樣的:

WHERE MONTH([Posting Date]) <> 12 OR 
     DAY([Posting Date]) <> 31 OR 
     CAST([Posting Date] AS TIME) <> CAST('23:59:59.000' AS TIME) 

更簡短的回答:

WHERE YEAR([Posting Date]) <> YEAR(DATEADD(ss, 1, [Posting Date])) 
+0

不幸的是,我得到的結果與我的查詢不起作用相同。 – Boone

+0

@Boone,是的,有一個錯誤,你需要'或' –

+3

我懷疑這樣做的性能會非常糟糕,因爲查詢優化器將無法使用任何索引並將不得不處理每一行。一個更好的主意是創建一個包含排除日期的表格(僅限50行),並從報告中排除這些表格,例如'WHERE [發佈日期]不在......) –

0

另一件事,你也可以做的就是這樣的事情,這是你已經嘗試過的情況稍有不同。

WHERE 1 = CASE 
     WHEN (
       DATEPART(MONTH, [POSTING DATE]) = 12 
       AND DATEPART(DAY, [POSTING DATE]) = 31 
       AND DATEPART(HOUR, [POSTING DATE]) = 23 
       AND DATEPART(MINUTE, [POSTING DATE]) = 59 
       AND DATEPART(SECOND, [POSTING DATE]) = 59 
       ) 
      THEN 0 
     ELSE 1 
     END 

在這種情況下我只是用一個CASE來識別那些有一年的最後一秒鐘的1/0評價沒有休息,並過濾掉不需要的記錄的日期行。

相關問題