选择日期范围

时间:2014-09-23 01:19:01

标签: sql firebird

我有这张桌子

CREATE TABLE Table1 (
    MY_ID  INTEGER NOT NULL,
    SCAN_TIME    TIMESTAMP NOT NULL,
    WORKCELL_ID  SMALLINT
);

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

例如:

Select * from Table1 
where SCAN_TIME between '20.9.2014' and '20.9.2014'

虽然在那个日期'20 .9.2014'中有记录,但我得到空的结果,只有当我将第二个日期增加一天为'21 .9.2014'时我才会得到结果!为什么这样,我该如何解决?

2 个答案:

答案 0 :(得分:3)

TIMESTAMP包含日期和时间。由于您未在WHERE条款中指定时间,因此它在两个时间都使用当天的开头。所以你实际上写的相当于:

WHERE SCAN_TIME between '20.9.2014 00:00:00' and '20.9.2014 00:00:00'

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

WHERE SCAN_TIME between '20.9.2014 00:00:00' and '20.9.2014 23:59:59'

答案 1 :(得分:2)

问题是您使用timestamp作为类型,由于时间部分,事情搞砸了。尝试使用Date

当你在2014-09-20和2014-09-20之间说过,你实际上是在2014-09-20午夜和2014-09-20午夜之间说的,显然除了午夜的确切时刻之外什么都没有

如果您无法控制表格结构,请执行以下评论中建议的PM 77-1 - 使用强制转换将timestamp投射到date

select 1 from table1
where cast(scan_time as date) between 'someday1' and 'someday2';
相关问题