条件查询返回时间戳,如果不是今天的日期,否则返回时间

时间:2013-08-07 13:58:06

标签: sql postgresql timestamp

我有一个SQL查询,我想从表中检索时间戳记录。

但是,如果今天的日期=该记录中的时间戳,则查询必须仅返回没有时区的时间。

如果记录的timestamp :: date不等于今天的日期,则返回时间戳。例子:

2013-08-07 18:00:18.692+01
2013-08-09 20:13:09.927+01

预期结果:

18:00:18.692 
2013-08-09 20:13:09.927+01

从这两个时间戳我希望能够从第一个时间检索到今天的日期,但是从第二个时间检索日期和时间,因为它不是今天的日期

2 个答案:

答案 0 :(得分:0)

哪个数据库?

日期始终与日期部分一起存储,因此这看起来像格式化问题。我有一个解决方案,但实际格式可能有点偏。问题似乎与逻辑有关,你可以轻松地研究格式化字符串以获得你想要的东西。

这是Oracle解决方案: (注意我使用DUAL中的UNION创建一个内联视图来模拟你的数据。只需在那里添加你的表。)

select dt, when,
case
  when trunc(sysdate) = trunc(dt) then to_char(dt, 'hh24:mi:ss')
  else to_char(dt, 'yyyy-dd-mm hh24:mi:ss')
end  yourResult
from
(
  select sysdate dt, 'today' when
  from dual
  union
  select sysdate-1 dt, 'yesterday' when
  from dual
);

这是一个SQL Server解决方案: (同样,有一个内联视图来模拟您的数据)

select dt, whn,
case
  when cast(getDate() As Date) = cast(dt As Date) then convert(varchar(20), dt, 108)
  else convert(varchar(20), dt, 120 )
end  your_Result
from
(
    select getDate() dt, 'today' whn
    union
    select getDate()-1 dt, 'yesterday' whn
)  x;

答案 1 :(得分:0)

这实际上是一个格式化问题,因此在应用程序代码中处理它可能会更好。但是你可以在SQL中完成它。

create table t (
  ts timestamp not null
  );

insert into t values 
('2013-01-01 08:00');
insert into t values 
(current_timestamp);

时间和时间戳数据类型与您想要返回它们的方式不兼容,因此转换为文本是有意义的。

select case when ts::date = current_date then ts::time::text
            else ts::text
       end
from t;

TS
--
2013-01-01 08:00:00
16:34:52.339