我正在开发一个用于记录用户活动的小型子系统。系统使用MS SQL Server作为数据库, Delphi7和ADO用于构建接口。
我遇到的问题是我无法找到具有特定日期/时间值的记录。
以下是问题的再现示例:
1。数据库:MS SQL Server 2005 Express Edition。
@Configuration
public class DataSourceConfig {
private static final Logger logger = Logger.getLogger(DataSourceConfig.class);
@Bean(destroyMethod = "")
public DataSource dataSource() {
DataSource dataSource = null;
JndiTemplate jndi = new JndiTemplate();
while (true)
try {
logger.info("Try to initialize datasource");
dataSource = (DataSource) jndi.lookup("java:comp/env/jdbc/macmonitor_liquibase_mysql");
break;
} catch (NamingException e) {
logger.error("Error while initializing datasource", e);
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
logger.error("Interupted exception in sleep method in datasource initialisation loop", e1);
return null;
}
continue;
}
logger.info("Datasource initialization success");
return dataSource;
}
@Bean
@Autowired
public SpringLiquibase liquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog("classpath:liquibase/db-changelog-master.xml");
liquibase.setDataSource(dataSource);
return liquibase;
}
}
2。示例代码: Delphi 7和ADO
-- Table creation
CREATE TABLE [tlog] (
[USERN] [numeric](10, 0) NULL,
[USERDATE] [datetime] NULL,
[LOGTEXT] [varchar](250) COLLATE Cyrillic_General_CS_AS NULL
);
-- Insert date/time value
INSERT INTO [tlog] (USERN, USERDATE, LOGTEXT)
VALUES (1, CURRENT_TIMESTAMP, 'Record current activity')
-- Insert date only value
INSERT INTO [tlog] (USERN, USERDATE, LOGTEXT)
VALUES (1, '02-02-2018', 'Record current activity')
-- Table's content
-------------------------------------------------------------
| USERN | USERDATE | LOGTEXT |
-------------------------------------------------------------
| 1 | 26/10/2015 17:13:36.597 | Record current activity |
-------------------------------------------------------------
| 1 | 02/02/2018 00:00:00.000 | Record current activity |
-------------------------------------------------------------
第3。预期结果:找到记录。
4。实际结果: TADOTable.Locate()返回FALSE。
我做错了什么以及如何将datetime值传递给TADOTable.Locate()方法?
提前致谢!
答案 0 :(得分:1)
您几乎正确地使用了Locate。几乎是因为在搜索 TDateTime 值时,您所包含的loPartialKey选项毫无意义。在这种情况下,您需要搜索确切的日期时间值。问题出在你的测试中。
您的第一次测试的日期时间值错误。其转换中会忽略其毫秒部分,因此您实际上正在尝试查找日期时间 26/10/2015 17:13:36 ,这不在您的表格中。
在第二种情况下,您正试图找到日期时间 26/10/2015 17:13 ,这不在您的表格中。
我建议使用例如EncodeDateTime函数用于构建日期时间而不是字符串转换,并使用loPartialKey选项删除这些额外的调用。
答案 1 :(得分:0)
使用类型字符串以yyyy-mm-dd格式查找日期或日期
示例:
位于:
ExampleItem
其中:
pre_save