【问题标题】:Can't Get SQL to pull Correct DateTime无法让 SQL 提取正确的日期时间
【发布时间】:2021-10-31 10:19:33
【问题描述】:

所以我遇到了一个问题,我一生都无法弄清楚如何获取我正在寻找的数据。

我想要做的是获取某个日期/时间之间的数据集合,数据库设置日期和时间的方式在不同的列中,其格式化方式是日期的 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

只要当天是同一天,它就可以正常工作,但是如果我将它跨越一天,它不会返回任何内容....

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

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

【问题讨论】:

  • 您是否会有日期范围,即开始日期不等于结束日期?如果是这样,您需要将开始日期/时间对与结束日期/时间对分开处理,以确保结果正确。
  • 是的,创建旧数据库的人将它们创建为整数,所以从技术上讲,它不是日期 2021/09/01,而是整数 20210901,所以从技术上讲,我得到了两个整数之间的范围。
  • 我的意思是,如果您在该范围内有 不同 日期,例如1997 年 5 月 3 日至 1998 年 6 月 17 日,则您需要单独处理日期。开始时间仅适用于 1997 年 5 月 3 日。从 1997 年 5 月 4 日到 1998 年 6 月 16 日的任何时间都在该范围内,如 1998 年 6 月 17 日到结束时间的部分。您选择的时间表示可能是当地日出后作为 Unicode 罗马数字字符串的基本周期大蒜面包块的数量是一个单独的问题。

标签: tsql ssms


【解决方案1】:

以下条件总是错误的,因为一个数字不能同时小于 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。现在它有时应该返回结果,但是在不了解您的逻辑或意图的情况下,我不能说它是否正确。

我建议使用 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
)

【讨论】:

  • 如果我要构建原始表,我 100% 会使用 DateTime,但是它是我继承的旧系统,我无法移动/更新它。很遗憾我坚持使用整数。我还尝试将整数转换为 DATETIME 以提取信息,但是我的查询从运行一两分钟到运行大约 13 分钟,旧数据库大约有 7500 万条记录...我正在尝试创建一个报告仅在特定时间之间提取数据。从上面的示例中,我想在 2021 年 9 月 1 日上午 6 点到 2021 年 9 月 1 日下午 2 点之间提取数据。当我尝试拉动时,Breaks 是什么...
  • 一夜之间的事情,所以如果我尝试在 2021 年 8 月 31 日下午 2 点到 2021 年 9 月 1 日凌晨 3 点之间获取数据。我的查询适用于在同一天提取数据,就在我结合多天并且并不总是返回 false 时。例如,如果我运行从同一天提取数据的查询,它将返回一些结果,例如
  • 我在上面添加了 Result set 用于格式化,但你可以返回一些数据
  • 我根据对您要求的理解更新了答案。
猜你喜欢
  • 2013-04-17
  • 2016-03-05
  • 1970-01-01
  • 2020-09-18
  • 2019-05-08
  • 2020-03-26
  • 2021-12-20
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多