我正在尝试创建一个时间戳类型的列,但只显示日期(没有时间)。
我在这个网站上找到了一个类似的例子: 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的新手,请帮助。
谢谢
答案 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();