我在 MySql 中有日期类型列。默认情况下,MySql 日期格式为 YYYY/MM/DD。但实际上我更喜欢使用 DD/MM/YYYY 格式。
我可以更改列日期格式吗?
不,您不能更改 DATE、DATETIME 或 TIMESTAMP 列的默认 MySQL 格式。
但是您可以在 SQL 语句中使用 MySQL 函数将 DATE 表达式输出为不同格式的字符串。
DATE_FORMAT( datecol , '%m/%d/%Y') AS datecol
(这将在 SELECT 列表中正常工作,但避免在任何谓词中使用它(即 WHERE 子句)。在那里,您将要引用裸列,并使用转换您首选格式 'MM/DD/YYYY' 的字符串STR_TO_DATE 函数,例如
datecol >= STR_TO_DATE('07/16/2012','%m/%d/%Y')
话虽如此,我认为在与数据库的交互中使用 MySQL 默认 DATE 格式并处理代码中的格式更改确实会更好。
其他 DBMS 具有您可以更改的默认格式,即使在会话的基础上也是如此。例如,在 Oracle 中,您可以简单地更改NLS_DATE_FORMAT
会话变量,Oracle 将使用您的自定义格式进行输入和输出。MySQL 没有。
有几个服务器变量(date_format
和datetime_format
) 您可能会考虑适合此目的:
mysql> SHOW VARIABLES LIKE 'date%_format';
+-----------------+-------------------+
| Variable_name | Value |
+-----------------+-------------------+
| date_format | %Y-%m-%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
首先,它们是服务器端的并且它们不是动态的(它们不能在运行时设置)。但更糟糕的是,它们从未真正使用过。这些变量根本不会影响日期格式。它们目前已被弃用并排队等待删除。
总结一下:不,你不能。日期格式是固定的。
尝试echo date('d/m/Y', strtotime($date));
这将获取您现有的日期,将其转换为 UNIX 时间并将其转换回具有您所需格式的日期。
正如其他人所解释的那样,这是不可能的,但这是替代解决方案,它需要进行一些调整,但它的工作方式类似于日期列。
我开始思考,如何让格式化成为可能。我有个主意。为它做触发器怎么样?我的意思是,添加 type 列char
,然后使用 MySQL 触发器更新该列。那行得通!我做了一些与触发器相关的研究,最后提出了这些查询:
CREATE TRIGGER timestampper BEFORE INSERT ON table
FOR EACH
ROW SET NEW.timestamp = DATE_FORMAT(NOW(), '%d/%m/%Y');
CREATE TRIGGER timestampper2 BEFORE UPDATE ON table
FOR EACH
ROW SET NEW.timestamp = DATE_FORMAT(NOW(), '%d/%m/%Y');
您不能使用TIMESTAMP
orDATE
作为列类型,因为它们有自己的格式,并且会自动更新。
所以,这是您的替代时间戳或日期替代方案!希望这会有所帮助,至少我很高兴我得到了这个工作。
迟到的答案:
这个问题令人困惑,因为日期类型列的格式通常为 YYYY-MM-DD,但我想我理解 OP 想问的问题:
他在字符串列中有日期,可能是 VARCHAR 或 CHAR 或 TEXT 类型,年月日用斜杠分隔,而不是连字符 (YYYY/MM/DD),并希望创建一个日期列,格式为日期(日/月/年)。
然后会这样,他可以在表中创建一个新列并使用以下事务来创建新格式
UPDATE table SET `new_date_column`=
CONCAT(
-- the day
(SELECT SUBSTRING_INDEX(`old_date_column`,'/',-1)),
"/",
-- the month
(SELECT SUBSTRING_INDEX((SELECT SUBSTRING_INDEX(`old_date_column`,'/',2)),'.',-1)),
"/",
-- the year
(SELECT SUBSTRING_INDEX(`old_date_column`,'/',1))
)
WHERE 1;