【发布时间】:2011-12-30 20:31:10
【问题描述】:
所以我在 Microsoft SQL 2008 中执行了以下语句:
SELECT
'UTC' AS timezone,
rel.unique_id AS relay,sns.unique_id AS sensor,
dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time,
SUM(CONVERT(FLOAT,dat.data)) AS total
FROM sensor_data dat
LEFT OUTER JOIN data_package pak ON dat.package_id = pak.id
LEFT OUTER JOIN relays rel ON pak.relay_id = rel.id
LEFT OUTER JOIN sensors sns ON dat.sensor_id = sns.id
LEFT OUTER JOIN sensor_types typ ON sns.sensor_type = typ.id
WHERE typ.name = 'Volume' AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) > ? AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) < ?
GROUP BY rel.unique_id,sns.unique_id, dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0)
ORDER BY time,relay,sensor
如果我像这样使用 jTDS/JDBC 驱动程序设置参数:
Parameter 1: 15
Parameter 2: 15
Parameter 3: 15
Parameter 4: 15
Parameter 5: 2011-10-31 20:00:00
Parameter 6: 15
Parameter 7: 15
Parameter 8: 2011-12-29 19:00:00
Parameter 9: 15
Parameter 10: 15
我得到错误:
Caused by: java.sql.SQLException: Column 'data_package.rtime' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
如果我在所有这些中手动输入 15 秒?空格,查询可以完美地使用日期作为参数。
1) 无论如何都要参数化间隔值(在这种情况下为 15),还是我只需要在它成为准备好的语句之前对其进行转义并搜索并替换它(如果这是真的,最好的转义方法是什么? Scala/Java 中的那个参数)
2) 我可以避免重复 dateadd(datediff()) 部分三次吗?我知道我不能在 WHERE 子句中引用“时间”,但是有没有其他方法可以在某个地方指定它以使其更清晰?
【问题讨论】:
标签: java sql sql-server-2008 scala jdbc