Postgresql - 仅在列时间类型中存储小时和分钟
Postgresql - store only hours and minutes in column time type
有一些选项可以在数据库中只存储小时和分钟(没有秒)?
我知道我可以在查询中使用函数 to_char,但这不是我的解决方案。
我是using/editing一个用PHP写的系统我不能编辑(我是说PHP),有点像所见即所得,直接把值注入进去表格(谈论编辑现有的),并且表格应该在 HH:MM 并且只要注入不会导致应用程序错误,保存(即使没有编辑)也会由于验证而导致错误,因为它注入 HH:MM:SS 因为那是列类型。
到目前为止,为了解决这个问题,我创建了文本列,但它会产生其他复杂情况,我想知道是否可以用不同的方式完成
假设
- 您无法修改您的 PHP 申请。
- 您希望保留
time
类型的列用于其他目的。
- 没有
select *
任何地方希望 table 的列布局保持不变。
- 你只需要这个应用程序的一部分到
select
, insert
和 update
那 table 就好像 HH:MM 是它的默认输出格式.
- 应用程序不会介意它会读取
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)
有一些选项可以在数据库中只存储小时和分钟(没有秒)?
我知道我可以在查询中使用函数 to_char,但这不是我的解决方案。
我是using/editing一个用PHP写的系统我不能编辑(我是说PHP),有点像所见即所得,直接把值注入进去表格(谈论编辑现有的),并且表格应该在 HH:MM 并且只要注入不会导致应用程序错误,保存(即使没有编辑)也会由于验证而导致错误,因为它注入 HH:MM:SS 因为那是列类型。
到目前为止,为了解决这个问题,我创建了文本列,但它会产生其他复杂情况,我想知道是否可以用不同的方式完成
假设
- 您无法修改您的 PHP 申请。
- 您希望保留
time
类型的列用于其他目的。 - 没有
select *
任何地方希望 table 的列布局保持不变。 - 你只需要这个应用程序的一部分到
select
,insert
和update
那 table 就好像 HH:MM 是它的默认输出格式. - 应用程序不会介意它会读取
text
而不是time
类型的数据,只要它是 HH:MM.
您可以进行列交换并处理触发器中的传入数据,同时保持实际 time
类型的列与其文本表示列之间的完整性。这样,任何不依赖于时间类型的数据的东西都会从特定的 table.
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)