JDBC 模板中的 DATEADD

Posted

技术标签:

【中文标题】JDBC 模板中的 DATEADD【英文标题】:DATEADD in JDBC template 【发布时间】:2021-05-06 13:44:58 【问题描述】:

我正在尝试使用 jdbcspring boot 进行查询选择,

我想要选择我的创建日期值小于现在减去 30 的信息。

我试过这样:

SELECT *  
FROM informations 
WHERE lastTreatment < DATEADD(MINUTE, -30, GETDATE())

我有这样的错误:

原因:org.springframework.jdbc.BadSqlGrammarException: StatementCallback;糟糕的 SQL 语法

有人知道吗?谢谢

【问题讨论】:

标记你的 dbms ,你的查询看起来没问题, 它是 oracle JDBC 这对Oracle来说是无效的。试试lasttreatment &lt; current_timestamp - interval '30' minute 【参考方案1】:

您声称是 Oracle,但看起来您编写的是 MS SQL Server 或 mysql。 Oracle 中没有 DATEADD 这样的函数,也没有 GETDATE 函数。要在日期中添加 x 天,只需执行 date+x。在这种情况下,您只需要一天的一小部分,因此只需添加一个 x 即可产生需要的部分。对于 30 分钟,这将是 30/(60*24) 或 (30 分钟/(每小时 60 分钟 * 每天 24 小时)。对于 GETDATE,只需使用 SYSDATE。 所以你的查询变成了:

SELECT *  
FROM informations 
WHERE lastTreatment < sysdate-(30/(60*24));

【讨论】:

我已经尝试过 sysdate 但它是一样的东西,似乎 SYSDATE 无法被 JDC 查询和 spring boot 识别 那么问题出在 JDBC 和/或 Spring 引导上。自 1997 年 6 月发布的第 8 版以来,Sysdate 一直是 Oracle 中的基本版本(我怀疑要旧得多,但快速的 Internet 搜索找不到更早的参考。)【参考方案2】:

也许不见了;最后?

SELECT *  
FROM informations 
WHERE lastTreatment < DATEADD(MINUTE, -30, GETDATE());

【讨论】:

不使用 Java 我们不放这个“;” , 是 JDBC 模板,问题出在日期,但我不知道具体是什么 不是java语法,是sql语法,应该是你的查询字符串的一部分。 如果标记为 Oracle SQL,则没有任何 ; 字符。 dateadd 这件事让我想知道它是否是别的东西。

以上是关于JDBC 模板中的 DATEADD的主要内容,如果未能解决你的问题,请参考以下文章

spring框架总结(04)----介绍的是Spring中的JDBC模板

如何分配所有的“?”使用 JDBC 模板中的对象数据?

模板方法设计模式在JDBC中的应用

模板方法设计模式在JDBC中的应用

如何使用 JDBC 模板更新字符变化数组

Spring的JDBC模板