有没有办法在查询中结合LIKE和BETWEEN的功能?

时间:2018-05-17 22:24:27

标签: sql-server

我正在进行查询,其中最明显的解决方案是结合Like和Between的功能,但我不确定它是否可能。

我的目标是让ID在某个范围之间,其中ID由前导代码构成,后跟日期时间,以及可能的更多字符,如下所示:

ABC180715051623XYZ

范围从当前时间到10分钟之前。主要人物对所选择的内容不重要,只是中心的日期时间数字。另一个问题是这些主要角色的长度可能不同,有时是2,有时则是4。

在那个注释中,我一直在尝试使用通配符等功能,但是它们根本不需要工作。有没有办法将它们结合起来?

谢谢

1 个答案:

答案 0 :(得分:0)

假设:

  1. 前导ID字符总是字母(实际上不是数字)
  2. 日期始终采用yyMMddhhmmss
  3. 格式

    然后你可以这样查询:

     SELECT * FROM [your_table]
     WHERE CONVERT(                                   -- Converts to a datetime
             DATETIME, STUFF(                         -- STUFF #1
                       STUFF(                         -- STUFF #2
                       STUFF(                         -- STUFF #3
               SUBSTRING([id_column],                    
                  PATINDEX('%[0-9]%',[id_column]),    -- gets the index of the first number
                   12),                               -- gets the 12 digit date string (SUBSTRING)
                   7, 0, ' '),                        -- adds a space between date and time portions (STUFF #3)
                   10, 0,  ':'),                      -- adds a ':' between hours and minutes (STUFF #2)
                   13, 0, ':'))                       -- adds a ':' between minutes and seconds (STUFF #1)
     BETWEEN DATEADD(minute,-10, CURRENT_TIMESTAMP)   -- 10 minutes ago
     AND CURRENT_TIMESTAMP;                           -- now
    

    这是获取ID的日期和时间部分并将其形成一个字符串,然后可以将其转换为datetime,然后可以在10分钟之前和现在之间使用。PATINDEX('%[0-9]%',[id_column])。我已尝试对其进行格式化以便可以阅读,但我会从下到上解释这些部分,以便您可以根据需要进行编辑。

    使用您的ID为

    的给定值
      

    ABC180715051623XYZ

    首先4这会在id列中获取(从1开始)索引的第一个数字。所以这将是SUBSTRING([id_column], 4, 12)

    这使180715051623得出STUFF('180715051623', 7, 0, ' ')

    然后180715 051623在第7个索引处放置一个空格,给出STUFF('180715 051623', 10, 0, ':')

    然后180715 05:1623提出了一个':'在第10个索引处,给出STUFF('180715 05:1623', 13, 0, ':')

    然后180715 05:16:23提出了一个':'在第13个索引处,给出privkey.pem

    然后将其转换为日期' 2018-07-15 05:16:23.000'然后在两个其他日期时间的between子句中使用。