无法获取 SQL 以提取正确的日期时间

Can't Get SQL to pull Correct DateTime

所以我 运行 遇到了一个问题,我一直都不知道如何获取我正在寻找的数据。

我想做的是获取某个 Date/Time 之间的数据集合,数据库设置日期和时间的方式在不同的列中,其格式为 yyyyMMDD日期和 hhmmss 的时间。 (不确定这是否重要,但我只想确保我解释了所有内容)数据位于旧的 DB2 服务器中,我在 SSMS 中使用链接服务器来拉取数据。我遇到问题的查询部分是

SELECT *
FROM WM370BASD.PRTRAN00   A 
WHERE
(
       A.PRTXTP            =     '300'                         
AND    A.PRTXCD            =     '003'                         
AND    A.PREDDT           >=     20210901  --BEGIN DATE
AND    A.PREDDT           <=     20210901  --END DATE    
AND    A.PREDTI           >=     060000    --BEGIN TIME 
AND    A.PREDTI           <=     140000    --END TIME                  
)
OR
(      A.PRTXTP            =     '200'                         
AND    A.PRTXCD            =     '001'                         
AND    A.PREDDT           >=     20210901  --BEGIN DATE
AND    A.PREDDT           <=     20210901  --END DATE    
AND    A.PREDTI           >=     060000    --BEGIN TIME 
AND    A.PREDTI           <=     140000    --END TIME                                      
AND    A.PRMNOP            =     'Dir Putaway'
)   
OR     
(      A.PRTXTP            =     '200'                         
AND    A.PRTXCD            =     '001'                         
AND    A.PREDDT           >=     20210901  --BEGIN DATE
AND    A.PREDDT           <=     20210901  --END DATE    
AND    A.PREDTI           >=     060000    --BEGIN TIME 
AND    A.PREDTI           <=     140000    --END TIME  
AND    A.PRMNOP            =     'Locate Cases'                
)
OR     
(      A.PRTXTP            =     '200'                         
AND    A.PRTXCD            =     '001'                         
AND    A.PREDDT           >=     20210901  --BEGIN DATE
AND    A.PREDDT           <=     20210901  --END DATE    
AND    A.PREDTI           >=     060000    --BEGIN TIME 
AND    A.PREDTI           <=     140000    --END TIME                 
AND    A.PRMNOP            =     'SKU Putaway'                 
)
OR     
(      A.PRTXTP            =     '200'                         
AND    A.PRTXCD            =     '002'                         
AND    A.PREDDT           >=     20210901  --BEGIN DATE
AND    A.PREDDT           <=     20210901  --END DATE    
AND    A.PREDTI           >=     060000    --BEGIN TIME 
AND    A.PREDTI           <=     140000    --END TIME                                    
AND    A.PRMNOP            =     'Pull Cases-Bulk'   
)

EDIT -- 添加结果集

 PREDTI PREDDT
 60001  20210901
 60005  20210901
 60010  20210901
 60012  20210901
 60012  20210901
 60013  20210901
 60024  20210901
 60025  20210901
 60032  20210901
 60042  20210901
 135950 20210901
 135947 20210901
 135938 20210901
 135937 20210901
 135934 20210901
 135928 20210901
 135923 20210901
 135923 20210901
 135921 20210901
 135918 20210901

只要当天是同一天,它就可以正常工作,但是如果我将它跨越一天,它 returns 什么都没有....

AND    A.PREDDT           >=     20210821  --BEGIN DATE
AND    A.PREDDT           <=     20210901  --END DATE    
AND    A.PREDTI           >=     140000    --BEGIN TIME 
AND    A.PREDTI           <=     030000    --END TIME  

我认为无论是什么问题都是小而愚蠢的,我只是忽略了它,我希望能有新的眼光!

以下条件将始终为假,因为一个数字不能同时小于 30000 和大于 140000。

AND    A.PREDTI           >=     140000    --BEGIN TIME 
AND    A.PREDTI           <=     030000    --END TIME  

制作如下:

AND (    A.PREDTI           >=     140000    --BEGIN TIME 
OR    A.PREDTI           <=     030000    )  --END TIME

使用括号是因为 AND 优先于 OR 并且使用 OR 而不是 AND。现在它有时应该 return 结果,但在不理解你的逻辑或意图的情况下,我不能说它是否正确。

我建议使用 DateTime 类型而不是整数,因为它是专门为此目的创建的。 如果您按照自己的方式使用整数,您会 运行 陷入其他问题。

编辑: 如果我正确理解你想要什么,你想要从 21/8 到 1/9,时间在 14:00 和 3:00 之间(第二天)。 所以 21/8 时间必须在 14:00 之后 22/8 到 1/9 时间必须在 3:00 之前或 14:00 之后 2/9(次日)时间必须在3:00

之前

这可以用下面的表达式来表达:

AND (
   A.PREDDT >= 20210822 AND A.PREDDT <= 20210901      
   AND (A.PREDTI >= 140000 OR A.PREDTI <= 030000)
   OR A.PREDDT = 20210902 AND A.PREDTI <= 030000
   OR A.PREDDT = 20210821 AND A.PREDTI >= 140000
)