2015-05-29 323 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评价没有休息,并过滤掉不需要的记录的日期行。

相关问题