将整数转换为时间,然后查询当前时间是否过去



我的任务是在我们的工厂设计运输系统。目前,我们以军事形式的卡车接送时间作为整数收到客户的订单。如果客户今天在上午6:30和下午5:00有两个拾音器,它将在INT列中显示两个订单,并在INT列中显示" 0630"one_answers" 1700"。我需要首先将该时间转换为军事时间,然后进行系统日期检查时间,以查看该订单是否过去的时间。因此,如果是上午7:00,我需要上午6:30命令不再出现在查询中。

链接到SQL小提琴的架构:http://sqlfiddle.com/#!18/b52be

我不确定如何将整数转换为可读的时间格式。理想情况下,至少我认为,如果我只能将其添加到当前的日期时间格式,则可以在其中添加一个子句,如果它> getDate()不显示,但是我不确定。任何帮助将不胜感激!

假设我正确理解您的要求,那么您可以像我在VALUES子句中所做的那样将int值转换为time,然后在WHERE中引用该值。但是请注意,这将影响查询的性能:

SELECT *
FROM orders o
     CROSS APPLY (VALUES(CONVERT(time(0),STUFF(RIGHT('0000' + CONVERT(varchar(4), pickup),4),3,0,':')))) V(pickuptime)
WHERE o.shipdate >= CONVERT(date, GETDATE())
  AND v.pickuptime > CONVERT(time(0), GETDATE());

以其他方式工作,然后将当前的日期时间转换为int(可能会表现更好):

SELECT *
FROM orders o
     CROSS APPLY(VALUES(CONVERT(int,REPLACE(LEFT(CONVERT(varchar(8),CONVERT(time,GETDATE()),109),5),':',''))))V(GD)
WHERE o.shipdate >= CONVERT(date, GETDATE())
  AND o.pickup > V.GD;

我建议您将日期存储在datetime字段中,而不是将它们存储在int字段中。原因是,今天,您将参数作为军事形式,明天您可能会以不同的格式获得。这不应该决定您的存储格式。您的存储格式应该不可知。

将日期存储在标准DateTimeFormat中后,查询就会变得非常简单。这不是您问题的答案。答案已经由@larnu提供。我只是给出不同的观点。

DECLARE @pickupDateTimeCutOff DATETIME = GETDATE()
SELECT * FROM orders WHERE  vpickupDateTime < @pickupDateTimeCutOff 

只需将时间添加到您的日期:

SELECT partnum, DATEADD(mi, pickup%100, DATEADD(hh, pickup/100, CONVERT(DATETIME, shipdate)))
FROM orders
WHERE DATEADD(mi, pickup%100, DATEADD(hh, pickup/100, CONVERT(DATETIME, shipdate))) > GETDATE()

最新更新