0

假设我有下一个查询:

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND UNIX_TIMESTAMP(Logins.FechaLogin) >= UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(Logins.FechaLogin) <= UNIX_TIMESTAMP(?)

我想要类似的东西:

Date = UNIX_TIMESTAMP(Logins.FechaLogin);

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND Date >= UNIX_TIMESTAMP(?) AND Date <= UNIX_TIMESTAMP(?)

stmt.setInt(1, EmployeeId);
stmt.setString(2, Date1);
stmt.setString(3, Date2);

全部进入准备好的语句(JDBC prepareStatement()),有没有办法我可以做这样的事情以避免查询冗余?还是这没用?顺便说一句,如果我是正确的,我认为它必须在每次 SELECT 迭代中传递 UNIX_TIMESTAMP 函数。

谢谢!

4

1 回答 1

1

简短的回答是否定的,您不能引用 MySQL 变量来代替列引用,或者代替包含列引用的表达式。在准备好的语句中,您只能将变量“绑定”到值;您不能“绑定”表名或列名。

(这个限制与 SQL 语句的处理方式有关。当 SQL 语句“准备好”时,优化器需要知道所有被引用的表和列。它必须验证引用是否有效,用户对引用的对象具有特权,它必须查找列的数据类型,检查合适的索引等等。问题是如果缺少列名,它就不能这样做。这解释了为什么你不会找不到任何关于如何做你想做的事的例子。)

显然,您可以使用 Java 变量和字符串操作来生成包含将传递给 MySQL 的 SQL 文本的字符串。但是传递给 MySQL 的最终字符串可以有占位符,但这些只能是值的占位符。

那应该回答你的问题。


关于 UNIX_TIMESTAMP 函数的使用(无论是必要的还是可取的),在函数中包含列引用的谓词的性能影响等方面,我们还可以做一些其他说明。但这些并不能真正回答您所问的问题.

于 2013-07-08T20:23:42.167 回答