2010-11-17 57 views
1

下面是正在SQL Server 2008上执行查询:Access查询为次

SELECT "dbo"."tblMainData"."recID" 
FROM "dbo"."tblMainData" 
WHERE ("timeInMain" BETWEEN {t '08:00:00'} AND {t '17:00:00'}) 

是由Microsoft Access 2007中生成该查询数据库已链接SQL Server 2008数据库中的表。

下面是访问查询生成上面的查询:

SELECT tblMainData.timeInMain 
FROM tblMainData 
WHERE (((tblMainData.timeInMain) Between #12/30/1899 8:0:0# And #12/30/1899 17:0:0#)); 

反正我知道有符合此条件的数据。为什么我没有看到预期的结果?

这是我第一次看到{t '08:00:00'}语法,我假设它应该忽略日期时间字段的日期部分。我找不到任何文档。

感谢您的任何帮助。

UPDATE

刚跑在SSMS,其中返回2010-11-17 08:00:00.000select {t '08:00:00'}。这就解释了为什么我没有收回数据。但是,正如您所看到的,Access查询明确指出要使用哪个日期,并且生成的TSQL不包含它。该怎么办?

UPDATE 2

我已经做了一些试验。访问权限仅在12/30/1899时从生成的TSQL中删除日期。显然,这是访问在用户在DateTime字段中仅存储时间时使用的特殊日期,并且Access假定如果它包含在查询中,那么它并不重要。哇。

所以,我相信我的选择是:从Access

  1. 调用存储过程。我不知道如何做到这一点呢。
  2. 更新sql server数据库中的数据,其日期不会在TSQL生成时被丢弃。
  3. 试图找到一种方法来使生成的TSQL包括明确的12/30/1899日期。 IDEAL

还有其他想法吗?

+2

花括号是当前的ODBC转义序列。请参阅:[日期,时间和时间戳转义序列](http://msdn.microsoft.com/en-us/library/ms712360.aspx) – 2010-11-17 21:03:06

+0

是否有可能直接发出TSQL查询,或者他们是否始终通过此访问翻译步骤? – Donnie 2010-11-17 21:25:16

+0

@Donnie - 我不知道。我几乎没有使用Access。我正在尝试为朋友解决这个问题。 – 2010-11-17 21:28:28

回答

1

你可以改变你的where子句用于删除日期比较

WHERE TimeValue(tblMainData.timeInMain) Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#

的左侧如果你知道数据库中的所有值将在12/30/1899以下比你可以做

WHERE tblMainData.timeInMain Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#

顺便说一句,如果你想这样做在SQL Server程序可以使用后的钢带的日期(它不是比你知道得多慢日期)

WHERE 
     DATEADD(DAY , -1 *DATEDIFF(DAY, 0, timeInMain) , timeInMain) 
        BETWEEN '09:00' and '17:00' 

UPDATE

以下是我测试过它

我创建了一个表,并用填充它的SQL Server以下

CREATE Test 
( 
    id int identity, 
    DateTimeValue DateTime 
) 

--Values with COM Zero Date 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 8:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 9:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 10:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 11:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 12:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 1:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 2:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 3:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 4:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 5:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 6:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 7:00 PM') 

--Values with SQL Zero Date 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 8:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 9:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 10:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 11:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 12:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 1:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 2:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 3:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 4:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 5:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 6:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 7:00 PM') 

--Abritrary Date After Zero Dates 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 8:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 9:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 10:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 11:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 12:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 1:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 2:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 3:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 4:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 5:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 6:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 7:00 PM') 

我创建了一个ODBC链接到MS Access 2007中的这张表然后创建了以下查询,结果在时间值为9:00 AM和5:00 PM之间的27条记录中

SELECT id, DateTimeValue 
FROM dbo_Test 
WHERE TimeValue(DateTimeValue) Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0# 
+1

这也有可能导致此查询的'timeInMain'列停用索引的可怕的副作用。 – Donnie 2010-11-17 21:22:18

+0

除此之外,它不起作用:http://i.imgur.com/k7CYm.png – 2010-11-17 21:23:56

+0

使用#而不是“文字的时间没有帮助。 – 2010-11-17 21:26:29