我有这张桌子
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日”时才能得到结果!为什么会这样以及我应该如何解决?
问题是您使用了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';
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
4094 次 |
| 最近记录: |