【问题标题】:How to insert records from one table into another and insert with unique datetime value如何将一个表中的记录插入另一个表并插入唯一的日期时间值
【发布时间】:2014-11-26 12:02:06
【问题描述】:

我想从一个表中选择值到另一个表中,并让每一行插入一个唯一的日期时间条目。我遇到的问题是 GETDATE() 或 SYSUTCDATETIME() 函数似乎不够快,而且我收到重复的日期时间条目。

例如 创建表#T1 (tnum int)

insert into #T1 select 1
insert into #T1 select 2
insert into #T1 select 3

create table #T2
(
Id int identity(1,1),
tnum int,
entrydate datetime
)

insert into #T2 SELECT #T1.tnum,  getDate() FROM #T1

select * from #T2

这会导致以下结果

1 1 2014-10-01 11:14:15.673

2 2 2014-10-01 11:14:15.673

3 3 2014-10-01 11:14:15.673

我的表格设计使用 datetime 列作为唯一索引的一部分,我需要它们是唯一的。我想要的结果会像

1 1 2014-10-01 11:14:15.673

2 2 2014-10-01 11:14:15.674

3 3 2014-10-01 11:14:15.675

我使用的是 Microsoft SQL Server 2008。

【问题讨论】:

  • "GETDATE() 或 SYSUTCDATETIME() 函数似乎不够快,我收到重复的日期时间条目。"您的意思不是看起来太快,因为您得到重复的日期时间吗?听起来您正在尝试将日期时间用作主键或类似的,这是有原因的吗?
  • 为什么不用TimeStamp字段?
  • 然后修正你的桌子设计。
  • 这个例子可能过于简化来定义我的问题,但我想要一个输入日期,它将成为自然索引的一部分(注意我不是指主键)。不应该有任何理由添加诸如序列之类的列,其唯一目的是使行独一无二。我的问题的主要部分仍然存在 - 我如何插入唯一的日期时间条目。这不是一个表格设计问题。
  • 可能不是数据设计问题,而是数据设计问题。

标签: sql-server tsql


【解决方案1】:

选择没问题,但您应该将datetime2 用于列的格式,因为它可以让您存储更精确的时间值。

datetime2 的精度为 100 纳秒,而 datetime 将其四舍五入为 .003.005.007

更新

或者您将插入语句包装在一个 while 循环中,其中每个步骤都包含几毫秒的睡眠时间。

我创建了这个小提琴,你可以在其中看到它是如何工作的(在 MSSQL 中):http://sqlfiddle.com/#!3/62f0d/2

基本上,块就和上面描述的一样:

/* @i represents a number of transactions, it can be equal to a count(*) for example */

WHILE (@i <= 3)
  BEGIN
    INSERT INTO #results VALUES (@i ,getDate(), getDate())
    WAITFOR DELAY '00:00:00.002'
    SET @i = @i + 1
END

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 2016-01-17
    • 2020-08-14
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多