Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL过滤掉任何年份的特定月份、日期和时间_Sql Server_Date_Datetime_Dynamics Nav - Fatal编程技术网

Sql server SQL过滤掉任何年份的特定月份、日期和时间

Sql server SQL过滤掉任何年份的特定月份、日期和时间,sql-server,date,datetime,dynamics-nav,Sql Server,Date,Datetime,Dynamics Nav,Microsoft Dynamics NAV使用yyyy-12-31 23:59:59.000的datetime来识别年度结账分录。我正在尝试写一份报告,除了这些之外,它将包含我所有的条目。如果我显式使用WHERE子句 WHERE [Posting Date] <> '2014-12-31 23:59:59.000') 其中[发布日期]‘2014-12-31 23:59:59.000’) 但我需要这个查询在任何一年都有效。我试过: WHERE (DATEPART(mm, [Pos

Microsoft Dynamics NAV
使用
yyyy-12-31 23:59:59.000的
datetime
来识别年度结账分录。我正在尝试写一份报告,除了这些之外,它将包含我所有的条目。如果我显式使用
WHERE
子句

WHERE [Posting Date] <> '2014-12-31 23:59:59.000')
其中[发布日期]‘2014-12-31 23:59:59.000’)
但我需要这个查询在任何一年都有效。我试过:

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)
其中(日期部分(mm,[过账日期])12)和
(日期部分(dd,[过账日期])31)和
(日期部分(hh,[发布日期])23)和
(日期部分(mi,[发布日期])59)和
(日期部分(ss,[发布日期])59)
但这过滤掉了12月的一切,或是31天的一切,或是23小时的一切,等等

是否有一种简单的方法可以过滤给定的日期时间,但不包括任何年份?

可能是这样的:

WHERE MONTH([Posting Date]) <> 12 OR
      DAY([Posting Date]) <> 31 OR
      CAST([Posting Date] AS TIME) <> CAST('23:59:59.000' AS TIME)
其中月份([过账日期])12或
第31天([过账日期])或
演员阵容([发布日期]为时间)演员阵容('23:59:59.000'为时间)
更简短的回答是:

WHERE YEAR([Posting Date]) <> YEAR(DATEADD(ss, 1, [Posting Date]))
其中年份([过账日期])年份(日期添加(ss,1,[过账日期])

您还可以做的另一件事是这样的,这与您尝试过的方法略有不同

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

在这种情况下,我只使用一个
案例
来识别那些日期为一年中最后一秒的行,其余的行由1/0计算并过滤掉不需要的记录。

不幸的是,我得到的结果与我的查询不起作用的结果相同。@Boone,是的,有一个错误,您需要
sI怀疑这样做的性能会非常差,因为查询优化器将无法使用任何索引,并且必须处理每一行。更好的办法是创建一个包含未来50年排除日期(仅50行)的表,并将其从报告中排除,例如使用“WHERE[Posting Date]NOT IN…”@PanagiotisKanavos,谢谢您的建议。虽然我的数据相对较小,但实现起来非常简单,执行时间从11秒减少到8秒。