【问题标题】:Conditional querying to return timestamp if NOT todays date , else return time如果不是今天的日期,则条件查询返回时间戳,否则返回时间
【发布时间】:2013-08-07 13:58:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能展示一些示例数据吗?
  • "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

标签: sql postgresql timestamp


【解决方案1】:

这本质上是一个格式问题,因此最好在应用程序代码中处理它。但是您可以在 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

【讨论】:

    【解决方案2】:

    哪个数据库?

    日期始终与日期部分一起存储,因此这似乎是一个格式问题。我在下面有一个解决方案,但实际格式可能有点偏差。问题似乎与逻辑有关,您可以轻松研究格式化字符串以获得所需的内容。

    这是一个 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;
    

    【讨论】:

    • 我有一个表,其中有一列时间戳,我想检索该列中的所有记录。返回今天日期的记录只能以时间形式返回(不需要今天日期),不等于今天日期的记录必须显示日期和时间。
    • 我认为这就是我的回答。您使用的是哪个数据库?如果我的解决方案有问题,请告诉我,我会修复它。如果有效,请将其标记为答案。
    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多