选择的日期范围

Wel*_*Wel 3 sql firebird

我有这张桌子

CREATE TABLE Table1 (
    MY_ID  INTEGER NOT NULL,
    SCAN_TIME    TIMESTAMP NOT NULL,
    WORKCELL_ID  SMALLINT
);
Run Code Online (Sandbox Code Playgroud)

当我使用 select SQL 获取两个日期之间的记录时,如果用户为两个日期选择相同的日期,我会得到空结果

例如:

Select * from Table1 
where SCAN_TIME between '20.9.2014' and '20.9.2014'
Run Code Online (Sandbox Code Playgroud)

虽然该日期“2014年9月20日”有记录,但我得到空结果,并且只有当我将第二个日期增加一天为“2014年9月21日”时才能得到结果!为什么会这样以及我应该如何解决?

Pet*_*Guo 5

问题是您使用了timestamp类型,并且由于时间部分而导致事情变得混乱。尝试使用Date.

当您说2014-09-20和2014-09-20之间时,您实际上是在说2014-09-20午夜和2014-09-20午夜之间,显然除了午夜的确切时刻之外没有任何其他时间。

如果您无法控制表结构,请执行PM 77-1在下面的评论中建议的操作 - 使用强制转换timestampdate

select 1 from table1
where cast(scan_time as date) between 'someday1' and 'someday2';
Run Code Online (Sandbox Code Playgroud)


Bar*_*mar 5

ATIMESTAMP包含日期和时间。由于您没有在子句中指定时间WHERE,因此这两个时间都使用一天的开始。所以你实际上写的是等价的:

WHERE SCAN_TIME between '20.9.2014 00:00:00' and '20.9.2014 00:00:00'
Run Code Online (Sandbox Code Playgroud)

除非时间戳的时间部分实际上是00:00:00,否则它不会满足这个标准。您应该将时间戳转换为日期,或指定范围内的时间,例如

WHERE SCAN_TIME between '20.9.2014 00:00:00' and '20.9.2014 23:59:59'
Run Code Online (Sandbox Code Playgroud)