SQL命令

时间:2017-08-16 15:52:35

标签: sql azure sql-timestamp

我在创建使用CURRENT_TIMESTAMP来指定日期的表时遇到了一些问题。我需要这个,因为我使用java jpa实体按日期检索它们。如果我跑到本地的h2数据库,我没有问题。

在这个例子中:

INSERT INTO Post (id, title, slug, teaser, body, author_id, posted_on)
VALUES (1, 'Spring Boot Rocks!', 'spring-boot-rocks', @TEASER, @BODY, 1, CURRENT_TIMESTAMP);

所有东西都被创建并且工作完美,但是当我在Azure SQL数据库中尝试相同的查询时,我正在连接到我收到错误

  

无法执行查询。错误:无法在a中插入显式值   时间戳列。将INSERT与列列表一起使用以排除   timestamp列,或将DEFAULT插入时间戳列。

如果我尝试将CURRENT_TIMESTAMP更改为TIMESTAMP,我会得到;

  

无法执行查询。错误:列名称'TIMESTAMP'无效。   如果我将其更改为DEFAULT,因为之前的错误表明表已创建但我无法按创建日期检索它们,因为DEFAULT不是时间值。

完整查询

SET IDENTITY_INSERT author ON

insert into author(id,first_name,last_name,email) values (1,'Dan','Vega','danvega@gmail.com');
insert into author(id,first_name,last_name,email) values (2,'John','Smith','johnsmith@gmail.com');

SET IDENTITY_INSERT author OFF
SET IDENTITY_INSERT post ON

DECLARE @TEASER varchar(4000) = 'text...'
DECLARE @BODY varchar(4000) = 'text...'

insert into Post(id,title,slug,teaser,body,author_id,posted_on) values (1,'Spring Boot Rocks!','spring-boot-rocks',@TEASER,@BODY,1,CURRENT_TIMESTAMP);
insert into Post(id,title,slug,teaser,body,author_id,posted_on) values (2,'Spring Data Rocks!','spring-data-rocks',@TEASER,@BODY,1,CURRENT_TIMESTAMP);
insert into Post(id,title,slug,teaser,body,author_id,posted_on) values (3,'John Blog Post 1','john-blog-post-1',@TEASER,@BODY,2,CURRENT_TIMESTAMP);
insert into Post(id,title,slug,teaser,body,author_id,posted_on) values (4,'John Blog Post 2','john-blog-post-2',@TEASER,@BODY,2,CURRENT_TIMESTAMP);
insert into Post(id,title,slug,teaser,body,author_id,posted_on) values (5,'John Blog Post 3','john-blog-post-3',@TEASER,@BODY,2,CURRENT_TIMESTAMP);
insert into Post(id,title,slug,teaser,body,author_id,posted_on) values (6,'Refactoring our Spring Data Project','refactoring-spring-data-project',@TEASER,@BODY,1,CURRENT_TIMESTAMP);

SET IDENTITY_INSERT post OFF

2 个答案:

答案 0 :(得分:4)

SQL Server(和SQL Azure)中的TIMESTAMP数据类型是 NOT ISO / ANSI标准定义的内容(这是SQL Server原始Sybase遗产的剩余部分)。

它实际上只是一个用于乐观并发检查的二进制计数器 - 它具有 NOTHING 来处理日期和/或时间!

要存储和处理日期和时间,请使用数据类型DATE(仅适用于日期 - 暂时)或DATETIME2(n)代替日期和时间

答案 1 :(得分:0)

通过使用application.properties spring.jpa.hibernate.ddl-auto=create-drop重新创建数据库并替换

来解决此问题
@CreatedDate @Column(columnDefinition = "TIMESTAMP")
private Date postedOn;

@CreatedDate @Column(columnDefinition = "DATETIME2(0)")
private Date postedOn;