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')
);
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
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;
8条答案
按热度按时间brgchamk1#
请记住,日期的格式与存储无关。如果您必须以该格式存储日期,则需要定义自定义数据类型或将其存储为字符串。然后您可以使用extract,类型转换和串联的组合来获得该格式。
然而,我怀疑你想存储一个日期并在输出时获得格式。所以,像这样的东西会为你做的伎俩:
(编辑为使用to_char)。
然后你可以得到如下输出:
现在,如果你确实需要将该字段存储为字符串并确保格式,你可以总是这样做:
9rbhqvlz2#
万一Milen A. Radev没有时间发布他的解决方案,这就是:
yshpjwxd3#
你为什么要这么做?
恕我直言,你应该将日期存储为默认类型,如果需要,可以将其转换为所需的格式。
你可以用视图来指定列的格式,我不知道其他的方法。
编辑日期:
说真的,在我看来,你应该创建一个日期类型的表的视图。我说的是这样的东西:
然后
并在应用程序中使用v_example_table。
shstlldc4#
感谢所有回答的人,也感谢那些给我函数格式想法的人,我会认真学习以备将来使用。
但是对于这种明确的情况,“特殊yyyymm字段”不被认为是日期字段,而只是作为标签,或者任何用于匹配精确的年-月研究值的东西;已经有另一个日期字段,具有完整的时间戳,但如果我需要2008年1月的所有行,我认为选择这样的字段会更快
而不是
iklwldmw5#
一个常见的误解是,你可以像这样去规范化以提高性能。对你的查询使用
date_trunc('month', date)
,如果你发现它运行得很慢,可以为此添加一个索引表达式。6tr1vspr6#
我从字面上理解你的问题。因为你不能。无论如何,日期戳至少同时有**“Y”,“M”,“D”*3个元素。
表8 - 10显示了日期类型的一些可能的输入。
https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE.
日期输出:
disbfnqx7#
要为格式为'YYYYMM'的表列设置默认值,您可以使用数据库管理系统,如PostgreSQL,MySQL或SQL Server。我将为这些系统提供示例。
CREATE TABLE your_table_name(id SERIAL PRIMARY KEY,column_name VARCHAR(6)NOT NULL DEFAULT TO_CHAR(CURRENT_DATE,'YYYYMM'),-- Other columns);
CREATE TABLE your_table_name(id INT AUTO_INCREMENT PRIMARY KEY,column_name VARCHAR(6)NOT NULL DEFAULT DATE_FORMAT(CURRENT_DATE,'%Y% m'),--其他列);
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”格式的当前年份和月份。
xlpyo6sf8#
对。最好使用一个函数:
这给了我
如果需要,请确保从Unix命令行运行
createlang plpgsql
。