如何设置像'YYYYMM'这样的Postgresql默认值日期戳?
Posted
技术标签:
【中文标题】如何设置像\'YYYYMM\'这样的Postgresql默认值日期戳?【英文标题】:How to set a Postgresql default value datestamp like 'YYYYMM'?如何设置像'YYYYMM'这样的Postgresql默认值日期戳? 【发布时间】:2010-10-28 23:41:39 【问题描述】:作为标题,如何将表格的列设置为当前年份和月份的默认值,格式为“YYYYMM”,例如今天的 200905?
【问题讨论】:
【参考方案1】:请记住,日期的格式与存储无关。如果您需要以该格式存储日期,您将需要定义自定义数据类型或将其存储为字符串。然后您可以使用extract、类型转换和连接的组合来获得该格式。
但是,我怀疑您想存储日期并获取输出格式。所以,这样的事情会为你解决问题:
CREATE TABLE my_table
(
id serial PRIMARY KEY not null,
my_date date not null default CURRENT_DATE
);
(CURRENT_DATE is basically a synonym for now() and a cast to date).
(编辑为使用 to_char)。
然后你可以得到你的输出:
SELECT id, to_char(my_date, 'yyyymm') FROM my_table;
现在,如果您确实确实需要将该字段存储为字符串并确保您始终可以使用的格式:
CREATE TABLE my_other_table
(
id serial PRIMARY KEY not null,
my_date varchar(6) default to_char(CURRENT_DATE, 'yyyymm')
);
【讨论】:
【参考方案2】:以防万一 Milen A. Radev 没有时间发布他的解决方案,就是这样:
CREATE TABLE foo (
key int PRIMARY KEY,
foo text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
【讨论】:
像这样的另一个答案在哪里消失了?【参考方案3】:你为什么要这样做?
恕我直言,您应该将日期存储为默认类型,并在需要时将其转换为所需格式。
您可以通过指定列的格式但使用视图来摆脱困境。其他方法我不知道。
已编辑:
说真的,在我看来,您应该在该表上创建一个日期类型的视图。我说的是这样的事情:
create table sample_table ( id serial primary key, timestamp date);
比
create view v_example_table as select id, to_char(date, 'yyyymmmm');
并在您的应用程序中使用 v_example_table。
【讨论】:
因为我需要它。我有一个 php 应用程序,它运行并使用这些值查询数据库,“yyyymm”为“200801”、“200802”等。以检索数据 - 我认为将其作为默认值会比 SELECT 更好字段 FROM 表 WHERE 列 BETWEEN timestamp1 AND timestamp2 我会使用已添加到回复中的解决方案来执行此操作。【参考方案4】:感谢所有回答的人,感谢那些给我函数格式想法的人,我会好好研究它以备将来使用。
但是对于这种明确的情况,“特殊 yyyymm 字段”不被视为日期字段,而只是作为标签,o 用于匹配精确的年月研究值的任何内容;已经有另一个日期字段,带有完整的时间戳,但如果我需要 2008 年 1 月的所有行,我认为这样的选择会更快
SELECT [columns] FROM table WHERE yearmonth = '200801'
而不是
SELECT [columns] FROM table WHERE date BETWEEN DATE('2008-01-01') AND DATE('2008-01-31')
【讨论】:
【参考方案5】:一种常见的误解是,您可以像这样进行非规范化以提高性能。使用date_trunc('month', date)
进行查询,如果您发现它运行缓慢,请为此添加索引表达式。
【讨论】:
【参考方案6】:我从字面上理解你的问题。 因为你做不到。 无论如何,datestamp 至少同时有 "Y","M","D" 3 个元素。
表 8.10 显示了日期类型的一些可能输入。https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE。
Example Description
1999-01-08 ISO 8601; January 8 in any mode (recommended format)
January 8, 1999 unambiguous in any datestyle input mode
1/8/1999 January 8 in MDY mode; August 1 in DMY mode
1/18/1999 January 18 in MDY mode; rejected in other modes
01/02/03 January 2, 2003 in MDY mode; February 1, 2003 in DMY mode; February 3, 2001 in YMD mode
1999-Jan-08 January 8 in any mode
Jan-08-1999 January 8 in any mode
08-Jan-1999 January 8 in any mode
99-Jan-08 January 8 in YMD mode, else error
08-Jan-99 January 8, except error in YMD mode
Jan-08-99 January 8, except error in YMD mode
19990108 ISO 8601; January 8, 1999 in any mode
990108 ISO 8601; January 8, 1999 in any mode
1999.008 year and day of year
J2451187 Julian date
January 8, 99 BC year 99 BC
日期输出:
datestyle Setting Input Ordering Example Output
SQL, DMY day/month/year 17/12/1997 15:37:16.00 CET
SQL, MDY month/day/year 12/17/1997 07:37:16.00 PST
Postgres, DMY day/month/year Wed 17 Dec 07:37:16 1997 PST
【讨论】:
【参考方案7】:没错。最好使用函数:
CREATE OR REPLACE FUNCTION yyyymm() RETURNS text
LANGUAGE 'plpgsql' AS $$
DECLARE
retval text;
m integer;
BEGIN
retval := EXTRACT(year from current_timestamp);
m := EXTRACT(month from current_timestamp);
IF m < 10 THEN retval := retval || '0'; END IF;
RETURN retval || m;
END $$;
SELECT yyyymm();
DROP TABLE foo;
CREATE TABLE foo (
key int PRIMARY KEY,
colname text DEFAULT yyyymm()
);
INSERT INTO foo (key) VALUES (0);
SELECT * FROM FOO;
这给了我
key | colname
-----+---------
0 | 200905
如有必要,请确保从 Unix 命令行运行 createlang plpgsql
。
【讨论】:
或者从 psql 中“创建语言 plpgsql”,这就是 createlang 所做的。以上是关于如何设置像'YYYYMM'这样的Postgresql默认值日期戳?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL 中将 varchar 字段 (YYYYMM) 转换为日期 (MM/01/YY)?
如何在 Java 中将 yyyymm 数据格式解析为 Month、YYYY 格式?