Postgresql - 仅在列时间类型中存储小时和分钟

Postgresql - store only hours and minutes in column time type

有一些选项可以在数据库中只存储小时和分钟(没有秒)?

我知道我可以在查询中使用函数 to_char,但这不是我的解决方案。

我是using/editing一个用PHP写的系统我不能编辑(我是说PHP),有点像所见即所得,直接把值注入进去表格(谈论编辑现有的),并且表格应该在 HH:MM 并且只要注入不会导致应用程序错误,保存(即使没有编辑)也会由于验证而导致错误,因为它注入 HH:MM:SS 因为那是列类型。

到目前为止,为了解决这个问题,我创建了文本列,但它会产生其他复杂情况,我想知道是否可以用不同的方式完成

假设

  1. 您无法修改您的 PHP 申请。
  2. 您希望保留 time 类型的列用于其他目的。
  3. 没有 select * 任何地方希望 table 的列布局保持不变。
  4. 你只需要这个应用程序的一部分到 select, insertupdate 那 table 就好像 HH:MM 是它的默认输出格式.
  5. 应用程序不会介意它会读取 text 而不是 time 类型的数据,只要它是 HH:MM.

您可以进行列交换并处理触发器中的传入数据,同时保持实际 time 类型的列与其文本表示列之间的完整性。这样,任何不依赖于时间类型的数据的东西都会从特定的 table.

获得 HH:MM 格式
drop table if exists test_70092210;
create table test_70092210 as select now()::time time_column;
select time_column from test_70092210;
--   time_column
-------------------
-- 12:06:23.890971
--(1 row)
alter table test_70092210 rename column time_column to time_column_raw;--column swap
alter table test_70092210 add column time_column text;--column swap
update test_70092210 set time_column=to_char(time_column_raw,'HH24:MI');
select time_column from test_70092210;
-- time_column
---------------
-- 12:06
--(1 row)

虽然可以使用触发器处理更新和插入:

CREATE or replace FUNCTION test_70092210_time_column_insert_handler() RETURNS trigger AS $test_70092210_time_column_insert_handler$
    BEGIN
        NEW.time_column_raw=coalesce(   NEW.time_column_raw::time,
                                        NEW.time_column::time);
        NEW.time_column=coalesce(   to_char(NEW.time_column_raw::time,'HH24:MI'),
                                    to_char(NEW.time_column::time,'HH24:MI'));
        RETURN NEW;
    END;
$test_70092210_time_column_insert_handler$ LANGUAGE plpgsql;
create or replace trigger test_70092210_time_column_insert_handler_trigger before insert on test_70092210
for each row execute function test_70092210_time_column_insert_handler();

CREATE or replace FUNCTION test_70092210_time_column_update_handler() RETURNS trigger AS $test_70092210_time_column_update_handler$
    BEGIN
        NEW.time_column_raw=case 
                                when NEW.time_column_raw<>OLD.time_column_raw
                                    then NEW.time_column_raw::time
                                else    
                                    NEW.time_column::time
                            end;
        NEW.time_column=case 
                            when NEW.time_column_raw<>OLD.time_column_raw
                                then to_char(NEW.time_column_raw::time,'HH24:MI')
                            else
                                to_char(NEW.time_column::time,'HH24:MI')
                        end;
        RETURN NEW;
    END;
$test_70092210_time_column_update_handler$ LANGUAGE plpgsql;
create or replace trigger test_70092210_time_column_update_handler_trigger before update on test_70092210
for each row execute function test_70092210_time_column_update_handler();

insert into test_70092210 select now()-'01:30'::time;
select time_column from test_70092210;
-- time_column
---------------
-- 12:06
-- 10:37
--(2 rows)
update test_70092210 set time_column='16:23' where ctid in (select min(ctid) from test_70092210);
select time_column from test_70092210;
-- time_column
---------------
-- 10:37
-- 16:23
--(2 rows)

有饼干也有吃:

select * from test_70092210;
-- time_column_raw | time_column
-------------------+-------------
-- 10:37:19.91891  | 10:37
-- 16:23:00        | 16:23
--(2 rows)