Java 包含时间戳日期比较的SQL查询

Java 包含时间戳日期比较的SQL查询,java,sql,Java,Sql,我有一个表事件日志,它有一个时间戳格式的字段。一些示例条目为“2016-01-28 12:37:48”、“2016-01-28 15:26:51” 现在我想编写一个查询,它将选择startTime和endTime之间的一些行。当我在SQL客户机中启动此查询时 SELECT Time,Data FROM event_log WHERE Data IN ('player disconnected','Player connected to server') AND Player_Detail

我有一个表事件日志,它有一个时间戳格式的字段。一些示例条目为“2016-01-28 12:37:48”、“2016-01-28 15:26:51”

现在我想编写一个查询,它将选择startTime和endTime之间的一些行。当我在SQL客户机中启动此查询时

SELECT Time,Data
FROM event_log
WHERE Data IN ('player disconnected','Player connected to server')
    AND Player_Details_ID = '1'
    AND Time > '2016-01-28 11:46:49' AND Time < '2016-02-09 14:38:39'
ORDER BY Time;
选择时间、数据
从事件日志
其中数据位于('player disconnected','player connected to server')
和Player_Details_ID='1'
时间>'2016-01-28 11:46:49'和时间<'2016-02-09 14:38:39'
按时间排序;
它给了我想要的输出。但是,当我用Java编写类似的查询时,它无法给出结果

sqlQuery = "Select e.Time,e.Data"
                + " from event_log e "
                + "where e.Data IN ('player disconnected','Player connected to server') "
                + "and e.Player_Details_ID = '1' and "
                + "e.TIME > " + "' + startSqlDate + '" + " and e.TIME < " + "' + endSqlDate + '"                    
                + " order by e.Time";
sqlQuery=“选择e.时间,e.数据”
+“从事件日志e”
+“其中e.数据位于('player disconnected','player connected to server')”
+“和e.Player\u Details\u ID='1'和”
+“e.TIME>”+“'+startSqlDate+”+“+”和e.TIME<”+“+endSqlDate+””
+“按e.Time订购”;

我哪里出错了?

您的第五行应该是:

+ "e.TIME > '" + startSqlDate + "' and e.TIME < '" + endSqlDate  + "'"
+“e.TIME>'”+startSqlDate+“”和e.TIME<'“+endSqlDate+””
(前提是变量是格式正确的字符串。)


您的版本根本不使用变量,而是编译为静态字符串。

您的第五行应该是:

+ "e.TIME > '" + startSqlDate + "' and e.TIME < '" + endSqlDate  + "'"
+“e.TIME>'”+startSqlDate+“”和e.TIME<'“+endSqlDate+””
(前提是变量是格式正确的字符串。)


您的版本根本不使用您的变量,而是编译成一个静态字符串。

在我看来,您需要编写\'than'。 这样可以避免字符串出现一些问题。 正如您所看到的,字符串中有变量名

类似的方法应该会奏效:

sqlQuery = "SELECT e.Time,e.Data"
            + " FROM event_log e "
            + "WHERE e.Data IN (\'player disconnected\',\'Player connected to server\') "
            + "AND e.Player_Details_ID = \'1\' AND "
            + "e.TIME > " + "\'" + startSqlDate + "\'" + " AND e.TIME < " + "\'" + endSqlDate + "\'"                    
            + " ORDER BY e.Time";
sqlQuery=“选择e.时间,e.数据”
+“从事件日志e”
+“其中e.数据位于(\'player disconnected\',\'player connected to server\')”
+“和e.Player\u Details\u ID=\'1\'和”
+“e.TIME>”+“\'”+startSqlDate+“\'”+”和e.TIME<“+”\'“+endSqlDate+”\”
+“按e.Time订购”;

在我看来,你需要写“than”。 这样可以避免字符串出现一些问题。 正如您所看到的,字符串中有变量名

类似的方法应该会奏效:

sqlQuery = "SELECT e.Time,e.Data"
            + " FROM event_log e "
            + "WHERE e.Data IN (\'player disconnected\',\'Player connected to server\') "
            + "AND e.Player_Details_ID = \'1\' AND "
            + "e.TIME > " + "\'" + startSqlDate + "\'" + " AND e.TIME < " + "\'" + endSqlDate + "\'"                    
            + " ORDER BY e.Time";
sqlQuery=“选择e.时间,e.数据”
+“从事件日志e”
+“其中e.数据位于(\'player disconnected\',\'player connected to server\')”
+“和e.Player\u Details\u ID=\'1\'和”
+“e.TIME>”+“\'”+startSqlDate+“\'”+”和e.TIME<“+”\'“+endSqlDate+”\”
+“按e.Time订购”;

无论您可能已定义的任何“startSqlDate”和“endSqlDate”变量的值如何,提交到数据库的查询始终是:

Select e.Time,e.Data from event_log e where e.Data IN ('player disconnected','Player connected to server') and e.Player_Details_ID = '1' and e.TIME > ' + startSqlDate + ' and e.TIME < ' + endSqlDate + ' order by e.Time
选择e.Time,e.Data from event_log e,其中e.Data IN('player disconnected','player connected to server')和e.player_Details_ID='1'和e.Time>'+startSqlDate+'和e.Time<'+endSqlDate+'按e.Time排序
这是因为变量名称在字符串中。将其更改为:

"Select e.Time,e.Data" + " from event_log e " + "where e.Data IN ('player disconnected','Player connected to server') " + "and e.Player_Details_ID = '1' and " + "e.TIME > '" + startSqlDate + "' and e.TIME < '" + endSqlDate + "' order by e.Time"
“从事件日志e“+”中选择e.Time、e.Data“+”,其中e.Data位于('player disconnected'、'player connected to server')“+”和e.player\u Details\u ID='1'和“+”e.Time>'“+startSqlDate+”和e.Time<'“+endSqlDate+”,按e.Time排序”

无论您可能已定义的任何“startSqlDate”和“endSqlDate”变量的值如何,提交到数据库的查询始终是:

Select e.Time,e.Data from event_log e where e.Data IN ('player disconnected','Player connected to server') and e.Player_Details_ID = '1' and e.TIME > ' + startSqlDate + ' and e.TIME < ' + endSqlDate + ' order by e.Time
选择e.Time,e.Data from event_log e,其中e.Data IN('player disconnected','player connected to server')和e.player_Details_ID='1'和e.Time>'+startSqlDate+'和e.Time<'+endSqlDate+'按e.Time排序
这是因为变量名称在字符串中。将其更改为:

"Select e.Time,e.Data" + " from event_log e " + "where e.Data IN ('player disconnected','Player connected to server') " + "and e.Player_Details_ID = '1' and " + "e.TIME > '" + startSqlDate + "' and e.TIME < '" + endSqlDate + "' order by e.Time"
“从事件日志e“+”中选择e.Time、e.Data“+”,其中e.Data位于('player disconnected'、'player connected to server')“+”和e.player\u Details\u ID='1'和“+”e.Time>'“+startSqlDate+”和e.Time<'“+endSqlDate+”,按e.Time排序”
“e.TIME>”+“'+startSqlDate+”+“+”和e.TIME<“+”+endSqlDate+”
不要这样,试试下面的

"e.TIME > '"+ startSqlDate + "' and e.TIME < '"+ endSqlDate + '"+ " order by e.Time";
“e.TIME>”+startSqlDate+“”和e.TIME<“+endSqlDate+”+“+”按e.TIME排序”;
“e.TIME>”+“'+startSqlDate+”+“+”和e.TIME<“+”+endSqlDate+”
不要这样,试试下面的

"e.TIME > '"+ startSqlDate + "' and e.TIME < '"+ endSqlDate + '"+ " order by e.Time";
“e.TIME>”+startSqlDate+“”和e.TIME<“+endSqlDate+”+“+”按e.TIME排序”;

我认为您的
sqlQuery
在第5行包含额外的
+“e.Time>=“+”'+startSqlDate+”
(您错过了
这部分之后)。
startSqlDate
endSqlDate
的类型和值是什么?@mzy很抱歉,这是一个错误。另外,startSqlDate和endSqlDate都是Java变量!(日期/时间通常不符合ANSI SQL。)在查询中,它们不是变量名,而是文字字符串。看到语法高亮灯是如何使它们变成红色而不是黑色的了吗?你的报价有问题。我强烈建议使用
PreparedStatement
,而不是尝试从变量构建查询。看看它:
“+startSqlDate+”
是一个Java字符串文字,包含一个SQL字符串文字,它是
+startSqlDate+
字面意思。我认为您的
sqlQuery
在第五行包含了额外的
+“e.Time>=”+“+startSqlDate+”
(您错过了
在这部分之后)。
startSqlDate
endSqlDate
的类型和值是什么?@mzy很抱歉,这是一个错误。另外,startSqlDate和endSqlDate都是Java变量!(日期/时间通常不符合ANSI SQL。)在您