2013-12-17 72 views
0

我有一个表的发票与此字段:串联日期和时间字段

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

我需要做的querys像

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

或类似的东西。我不知道如何连接invDate和invTime来创建日期时间字段。我唯一能做的事情是这样的可怕的事情:

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驱动程序。

回答

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

对不起,我忘了告诉我,我正在使用PHP的ODBC驱动程序使用vfp。看起来像我做错了什么或不支持,如果我尝试CAST('2013-12-17'AS日期时间)我得到“功能名称丢失”。或CAST(inv AS AS DATETIME)。那意味着CAST不存在? –

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 AM。

现在,来完成你的查询。

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

因为这似乎是一个查询给定的日期/时间,现在之间的所有发票(经日期时间()),你甚至都不需要之间,你可以做

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

如果您专门确实有一个日期/时间范围来考虑,那么你可以不喜欢你的日期

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

问题()和时间()实现

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

至于TIME()函数只是期望一个数字,并且对你没有用处。从OleDbProvider中,最好的办法是创建一个php函数,它以我描述的CTOT()格式构建单个字符串,并将日期和时间字段传递给php函数。然后使用它作为你的“CTOT(functionReturnResult)”

+0

我需要使用BETWEEN,因为日期来自表单以生成报告。谢谢CTOT,它正在工作。我现在唯一不能做的事情是把日期和时间连接成一个日期时间字段。 DATETIME(invDate + invTime)不起作用。因为如果我尝试使用AND invDate> DATE('2013-12-05')和invTime> TIME('11:18')和invDate

+0

@CarlosGoce,请参阅本答案的修订版底部 – DRapp