如何创建仅在表中显示日期部分的时间戳

时间:2014-01-20 00:34:27

标签: mysql datetime timestamp

我正在尝试创建一个时间戳类型的列,但只显示日期(没有时间)。

我在这个网站上找到了一个类似的例子: http://www.w3schools.com/sql/func_curdate.asp

但是,当我运行此示例SQL时:

CREATE TABLE Orders
(
  OrderId int NOT NULL,
  ProductName varchar(50) NOT NULL,
  OrderDate datetime NOT NULL DEFAULT CURDATE(),
  PRIMARY KEY (OrderId)
)

我遇到语法错误。 我是SQL的新手,请帮助。

谢谢

2 个答案:

答案 0 :(得分:1)

CURDATE()是一个函数,你不能将它用作默认值。

来自http://dev.mysql.com/doc/refman/5.5/en/data-type-defaults.html

  

数据类型规范中的DEFAULT值子句指示列的默认值。除了一个例外,默认值必须是常量;它不能是一个功能或表达。这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()或CURRENT_DATE。例外情况是您可以将CURRENT_TIMESTAMP指定为TIMESTAMP列的默认值。请参见第11.3.5节“TIMESTAMP的自动初始化和更新”。

这意味着您可以像这样解决它:

CREATE TABLE Orders
(
    OrderId int NOT NULL,
    ProductName varchar(50) NOT NULL,
    OrderDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (OrderId)
);

让我们在此表中插入一些内容:

INSERT INTO Orders(OrderId, ProductName) VALUES (1,'Foo');

现在选择:

SELECT OrderId,ProductName,OrderDate FROM Orders;

+---------+-------------+---------------------+
| OrderId | ProductName | OrderDate           |
+---------+-------------+---------------------+
|       1 | Foo         | 2014-01-20 02:12:27 |
+---------+-------------+---------------------+

上面给出了OrderDate的日期和时间,如果您只想要日期部分,那么这里是解决方案:

SELECT OrderId,ProductName,DATE(OrderDate) AS OrderDate FROM Orders;

+---------+-------------+------------+
| OrderId | ProductName | OrderDate  |
+---------+-------------+------------+
|       1 | Foo         | 2014-01-20 |
+---------+-------------+------------+

答案 1 :(得分:0)

要仅存储日期,您可以将类型指定为DATE,然后创建触发器,将orderDate设置为CURDATE(),如下所示。

CREATE TABLE Orders
(
  OrderId int NOT NULL,
  ProductName varchar(50) NOT NULL,
  OrderDate DATE,
  PRIMARY KEY (OrderId)
);

CREATE TRIGGER mytrigger
BEFORE INSERT
ON Orders
FOR EACH ROW
SET NEW.OrderDate = CURDATE();

sqlFiddle