我正在进行查询,其中最明显的解决方案是结合Like和Between的功能,但我不确定它是否可能。
我的目标是让ID在某个范围之间,其中ID由前导代码构成,后跟日期时间,以及可能的更多字符,如下所示:
ABC180715051623XYZ
范围从当前时间到10分钟之前。主要人物对所选择的内容不重要,只是中心的日期时间数字。另一个问题是这些主要角色的长度可能不同,有时是2,有时则是4。
在那个注释中,我一直在尝试使用通配符等功能,但是它们根本不需要工作。有没有办法将它们结合起来?
谢谢
答案 0 :(得分:0)
假设:
yyMMddhhmmss
然后你可以这样查询:
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子句中使用。