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

Sql 将整数转换为时间,然后查询当前时间是否超过该整数,sql,sql-server,Sql,Sql Server,我的任务是设计我们工厂的运输系统。目前,我们从客户处收到的订单中,军用卡车提货时间为整数。如果客户今天在上午6:30和下午5:00有两次取货,则会在int列中显示两个订单,分别为“0630”和“1700”。我需要首先将int时间转换为军用时间,然后进行系统日期检查时间,以查看该顺序是否超过当前时间。所以如果是早上7点,我需要早上6:30的命令,以便不再出现在查询中 链接到SQL fiddle with schema: 我不知道如何将整数转换为可读的时间格式。理想情况下,至少我认为,如果我可以将其

我的任务是设计我们工厂的运输系统。目前,我们从客户处收到的订单中,军用卡车提货时间为整数。如果客户今天在上午6:30和下午5:00有两次取货,则会在int列中显示两个订单,分别为“0630”和“1700”。我需要首先将int时间转换为军用时间,然后进行系统日期检查时间,以查看该顺序是否超过当前时间。所以如果是早上7点,我需要早上6:30的命令,以便不再出现在查询中

链接到SQL fiddle with schema:


我不知道如何将整数转换为可读的时间格式。理想情况下,至少我认为,如果我可以将其设置为当前日期时间格式,我可以添加一个where子句,其中if is>getdate()不显示,但我不能完全确定。任何帮助都将不胜感激

假设我正确理解您的需求,那么您可以将
int
值转换为
time
,就像我在
VALUES
子句中所做的那样,然后在
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
(这可能会更好):


假设我正确理解您的需求,那么您可以将
int
值转换为
time
,就像我在
VALUES
子句中所做的那样,然后在
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 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()

只需将时间添加到日期:

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()

我建议您将日期存储在
datetime
字段中,而不是存储在
int
字段中。原因是,今天,你得到的参数是军用格式,明天你可能会得到不同的格式。这不应决定您的存储格式。您的存储格式应该与查询方式无关

一旦将日期存储在标准datetimeformat中,查询就会变得非常简单。这不是你问题的答案。@Larnu已经提供了答案。我只是给出了不同的观点

DECLARE @pickupDateTimeCutOff DATETIME = GETDATE()
SELECT * FROM orders WHERE  vpickupDateTime < @pickupDateTimeCutOff 
DECLARE@pickupDateTimeCutOff DATETIME=GETDATE()
从订单中选择*,其中VPICKUPDATETIMECUTOFF

我建议您将日期存储在
datetime
字段中,而不是存储在
int
字段中。原因是,今天,你得到的参数是军用格式,明天你可能会得到不同的格式。这不应决定您的存储格式。您的存储格式应该与查询方式无关

一旦将日期存储在标准datetimeformat中,查询就会变得非常简单。这不是你问题的答案。@Larnu已经提供了答案。我只是给出了不同的观点

DECLARE @pickupDateTimeCutOff DATETIME = GETDATE()
SELECT * FROM orders WHERE  vpickupDateTime < @pickupDateTimeCutOff 
DECLARE@pickupDateTimeCutOff DATETIME=GETDATE()
从订单中选择*,其中VPICKUPDATETIMECUTOFF

Hmm,那么也许我们可以反向工作,将getdate()转换为int,以利用索引?是的,我在想@GeorgeMenoutis@Larnu你能给我简要介绍一下十字架吗?我以前从未见过,但我也是这个领域的业余爱好者。交叉申请真是太棒了!检查这里提供的一些很酷的功能:
交叉应用
通常与表值函数@DaveHolt一起使用。与
JOIN
不同,它不需要
ON
子句(实际上,它不支持
ON
,因为您通常使用相关查询)。此外,与带有子查询的
连接不同,您可以引用
连接
之外的对象;我发现它的特定部分非常有价值,比如“
top1
joins”)。在本例中,我使用了
VALUES
子句和一个表达式,该表达式(最终)将
pickup
的值转换为
time
,或者将
GETDATE()
转换为当前时间的整数表示形式(取决于您正在查看的查询)。嗯,也许我们可以向后转换GETDATE()用int来利用索引?是的,我在想@GeorgeMenoutis@Larnu你能给我简要介绍一下十字架吗?我以前从未见过,但我也是这个领域的业余爱好者。交叉申请真是太棒了!检查这里提供的一些很酷的功能:
交叉应用
通常与表值函数@DaveHolt一起使用。与
JOIN
不同,它不需要
ON
子句(实际上,它不支持
ON
,因为您通常使用相关查询)。此外,与带有子查询的
连接不同,您可以引用
连接
之外的对象;我发现它的特定部分非常有价值,比如“
top1
joins”)。在本例中,我使用了
VALUES
子句和一个表达式,该表达式(最终)将
pickup
的值转换为
time
,或将
GETDATE()
转换为当前时间的整数表示形式(取决于您正在查看的查询)。感谢您的回复。我不会说这是不可能的,但我并不是在实际生成订单,这是我们从客户那里收到订单的方式。我不明白他们为什么那样做,但我必须努力适应他们的要求。@DaveHolt,明白了。我理解。谢谢你的回复。谢谢你的回复。我不会说这是不可能的,但我并不是在实际生成订单,这是我们从客户那里收到订单的方式。我不明白他们为什么那样做,但我必须这样做