如何设置Postgresql默认值日期戳,如'YYYYMM'?

yduiuuwa  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(8)|浏览(471)

作为标题,我如何将表的列设置为默认值当前年份和月份,格式为'YYYYMM',如今天的200905?

brgchamk

brgchamk1#

请记住,日期的格式与存储无关。如果您必须以该格式存储日期,则需要定义自定义数据类型或将其存储为字符串。然后您可以使用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')
);
9rbhqvlz

9rbhqvlz2#

万一Milen A. Radev没有时间发布他的解决方案,这就是:

CREATE TABLE foo (
    key     int PRIMARY KEY,
    foo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
yshpjwxd

yshpjwxd3#

你为什么要这么做?
恕我直言,你应该将日期存储为默认类型,如果需要,可以将其转换为所需的格式。
你可以用视图来指定列的格式,我不知道其他的方法。

编辑日期:

说真的,在我看来,你应该创建一个日期类型的表的视图。我说的是这样的东西:

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。

shstlldc

shstlldc4#

感谢所有回答的人,也感谢那些给我函数格式想法的人,我会认真学习以备将来使用。
但是对于这种明确的情况,“特殊yyyymm字段”不被认为是日期字段,而只是作为标签,或者任何用于匹配精确的年-月研究值的东西;已经有另一个日期字段,具有完整的时间戳,但如果我需要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')
iklwldmw

iklwldmw5#

一个常见的误解是,你可以像这样去规范化以提高性能。对你的查询使用date_trunc('month', date),如果你发现它运行得很慢,可以为此添加一个索引表达式。

6tr1vspr

6tr1vspr6#

我从字面上理解你的问题。因为你不能。无论如何,日期戳至少同时有**“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
disbfnqx

disbfnqx7#

要为格式为'YYYYMM'的表列设置默认值,您可以使用数据库管理系统,如PostgreSQL,MySQL或SQL Server。我将为这些系统提供示例。

  1. PostgreSQL:
    CREATE TABLE your_table_name(id SERIAL PRIMARY KEY,column_name VARCHAR(6)NOT NULL DEFAULT TO_CHAR(CURRENT_DATE,'YYYYMM'),-- Other columns);
  2. MySQL:
    CREATE TABLE your_table_name(id INT AUTO_INCREMENT PRIMARY KEY,column_name VARCHAR(6)NOT NULL DEFAULT DATE_FORMAT(CURRENT_DATE,'%Y% m'),--其他列);
  3. SQL服务器:
    CREATE TABLE your_table_name(id INT IDENTITY(1,1)PRIMARY KEY,column_name VARCHAR(6)NOT NULL DEFAULT FORMAT(GETDATE(),'yyyyMM'),-- Other columns);
    将your_table_name和column_name替换为相应的表名和列名。这将创建一个表,其中列的默认值设置为“YYYYMM”格式的当前年份和月份。
xlpyo6sf

xlpyo6sf8#

对。最好使用一个函数:

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

相关问题