选择日期范围

3

我有这张数据表

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”时才能获得结果!为什么会这样,我该怎么修复?


1
你漏掉了单词 BETWEEN - Barmar
2个回答

5
问题在于你使用了类型为timestamp,由于时间部分而导致出现问题。尝试使用Date类型。
当你说的是2014-09-20和2014-09-20之间,实际上是指2014-09-20零点到2014-09-20晚上12点之间,显然只有正好到达午夜这一刻才有东西处于两者之间。
如果你无法控制表结构,请按照PM 77-1在下面评论中提到的方法进行操作-将timestamp转换为date类型。
select 1 from table1
where cast(scan_time as date) between 'someday1' and 'someday2';

...或在查询中转换为日期类型 - PM 77-1

5

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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接