连接日期和时间字段

时间:2013-12-17 17:08:45

标签: sql visual-foxpro

我有这个字段的表发票:

invDate -> a date field
invTime -> a time field

我需要做像

这样的查询
SELECT top 10 * from invoices WHERE DATETIME(invDate+invTime) 
BETWEEN DATETIME('2013-12-17 17:58') AND DATETIME()

或类似的东西。我不知道如何连接invDate和invTime来创建一个datetime字段。我唯一能做的就是这件事可怕:

DATETIME( YEAR(invDate), MONTH(invDate), DAY(invDate), 17, 52 ) AS MyDatetime

甚至无法获得小时(invTime)和分钟(invTime)的小时和时间:

DATETIME( YEAR(invDate), MONTH(invDate), DAY(invDate), 
HOUR(invTime), MINUTE(invTime) ) AS MyDatetime

我正在通过PHP通过VFP Odbc驱动程序进行查询。

2 个答案:

答案 0 :(得分:2)

你非常接近。如果来自PHP的值不是日期/时间,VFP如何正确解释它。 VFP还有一个函数CTOT()(字符到时间),并期望它的格式为'yyyy-mm-ddThh:MM:ss ??'

yyyy = 4 digit year
mm = 1 OR 2 digit month
dd = 1 OR 2 digit day
T -- literally the letter "T"
hh = 1 OR 2 digit hour (but typical is 2 anyhow)
MM = 1 or 2 digit minute (but typical is 2)
ss = 1 or 2 digit for seconds -- not required
?? = "AM" or "PM" if you wanted to explicitly provide that vs 24 hour clock

MM和ss是可选的,所以如果你完成“T1”将是凌晨1:00:00

现在,完成您的查询。

WHERE DATETIME(invDate+invTime) 
BETWEEN DATETIME('2013-12-17 17:58') AND DATETIME()

由于这似乎是在给定日期/时间与现在(通过DateTime())之间查询所有发票,您甚至不需要介于此之间,您可以这样做

WHERE YourTable.Column > CTOT( '2013-12-17T17:58')

如果您特别要求DID考虑日期/时间范围,那么您可以执行类似

的操作
WHERE YourTable.Column BETWEEN CTOT( '2013-12-05T10:00') AND CTOT( '2013-12-14T11:58')

您的DATE()和TIME()实现存在的问题

问题是Date()是一个返回当前日期的函数,或者是基于提供的y / m / d创建的函数,例如date(2013,12,7)。如果要传递字符串,请使用CTOD('mm / dd / yyyy'),例如CTOD(12,7,2007)。

至于期望数字的TIME()函数,对你没用。从OleDbProvider,你最好的选择是创建一个php函数,以我描述的CTOT()格式构建一个单独的字符串,并将日期和时间字段传递给php函数。然后将其用作“CTOT(functionReturnResult)”

答案 1 :(得分:1)

要将DateTime字段添加到一起,您需要将它们转换为相同的数据类型第1,而不是简单地将它们添加到这样的内容......

DECLARE @D DATE = '2013-12-17' 
DECLARE @T TIME = '17:58:00'

SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)

<强>结果

2013-12-17 17:58:00.000

您的查询

SELECT top 10 * 
from invoices 
WHERE CAST(invDate AS DATETIME) + CAST(invTime AS DATETIME) 
BETWEEN '20131217 17:58:00.000' AND GETDATE()