RTRIM在where子句中

时间:2019-01-03 12:15:21

标签: sql sql-server sql-server-2012

我正在使用Microsoft SQL Server 2012 Management Studio。在下面的表格中,我试图摆脱2019年1月1日至2019年1月4日之间的ID数字,这些ID数字为5位数字或破折号以零开头。

IDnum        DateTime
-----------------------
11-102434    03/01/2019    
11-02434     03/01/2019 
11-102421    02/01/2019
11-02421     02/01/2019
10-02345     31/12/2018

这就是我想看到的

IDnum        DateTime
-------------------------
11-102434    03/01/2019    
11-102421    02/01/2019
10-02345     31/12/2018

我认为where子句中需要某种RTRIM(),但不确定如何执行此操作。

4 个答案:

答案 0 :(得分:3)

这不是一个相对简单的where子句吗?

where not (datetime >= '2019-01-01' and datetime < '2019-01-05' and
           (idnum like '%-_____' or
            idnum like '%-0%'
           )
          )

答案 1 :(得分:2)

这是一种方式。

SELECT IDnum, DateTime
  FROM YourTable
 WHERE NOT (DateTime >= '2019-01-01' AND DateTime < '2019-01-05' --exclude from 1st Jan 2019 to 4th Jan 2019
             AND (IDnum LIKE '%-_____'  --that are 5 digits long after the dash
                  OR 
                  IDnum LIKE '%-0%'  --or begin with a 0 (after the dash)
                 )
           )

答案 2 :(得分:1)

阅读您的问题,排除的数据中有两个主要标准:

  1. 日期为2019年1月1日至2019年1月4日之间, AND
  2. IDNum的长度为5个字符(短划线后) OR IDNum(短划线后)的长度为0。

与@Gordon的答案一样,您可以将其包装在NOT中:

WHERE NOT
(
    [DateTime] >= '2019-01-01'
    AND [DateTime] <= '2019-01-04'
    AND
    (
        IDNum LIKE '%-0%'
        OR IDnum LIKE '%-_____'
    )
)

使用De Morgan's laws,我们可以简化一下(或至少分发NOT):

WHERE
(
    [DateTime] < '2019-01-01'
    OR [DateTime] > '2019-01-04'
    OR
    (
        IDNum NOT LIKE '%-0%'
        AND IDnum NOT LIKE '%-_____'
    )
)

答案 3 :(得分:0)

如果您的目的是满足以下两个条件:=

  1. DateTime应该在2019年1月1日至1月4日之间

  2. 在IDNum中,“-”后的数字长度应大于或等于5, 那么您可能不需要rtrim。

代码:

Select * from Test where DateTime >= '01-01-2019' and DateTime <= '01-03-2019' and ((SUBSTRING(IDNum, 4, 1) = 0) or LEN(SUBSTRING(IDNum, 4, LEN(IDNum)-1)) >= 5);

虽然我不确定您的预期结果如何显示2018年12月31日。 :D