我有这个字段的表发票:
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驱动程序进行查询。
答案 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)
要将Date
和Time
字段添加到一起,您需要将它们转换为相同的数据类型第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()