如何实现包含Datetime

时间:2017-08-23 12:36:06

标签: c# sql-server

我有一个带有auto_increment id的MSSQL表。现在我需要一个额外的唯一itemID(bigint),它包含这种格式的创建日期:yyyymmdd ###

所以,例如第一个itemID是20170823001,2017082300n .. 如果日期更改,则应以1:201708240001

重新启动

目前我通过SELECT MAX(itemID)在我的c#应用程序中实现它,然后在c#代码中进行比较(如果那天已经添加了项目)。

然而问题是这是在webapi上运行的,并且有可能两个不同的查询获得MAX(itemID)相同的结果并生成相同的新itemID。这将导致至少一个客户端出现异常。

所以我试图在sql server上直接实现它,以避免重复。

1 个答案:

答案 0 :(得分:0)

为分区生成唯一ID并不容易,因为内置的identity为整个表生成唯一值,而不是它的一部分。还有其他选择,但以下内容很容易实现,并且可以在并发环境中使用。

表结构是:

IF OBJECT_ID('[dbo].[DataSource]') IS NOT NULL
BEGIN;
    DROP TABLE [dbo].[DataSource];
END;

CREATE TABLE [dbo].[DataSource]
(
    [RecordID] INT PRIMARY KEY IDENTITY (1,1)
   ,[DateAdded] DATE CONSTRAINT DF_DataSource_DateAdded DEFAULT (GETUTCDATE())
   ,[value] NVARCHAR(128)
);

{1}}将始终是唯一的,因为SQL Server正在处理其值。我们有[RecordID]列,以便知道何时插入值。在这种情况下,您只需填充[DateAdded]列。

假设我们有以下数据:

[value]

将在读取时创建自定义INSERT INTO [dbo].[DataSource] ([DateAdded], [value]) VALUES ('2017-08-23 00:00:00', 'value 01') ,('2017-08-23 00:00:00', 'value 02') ,('2017-08-24 00:00:00', 'value 03') ,('2017-08-25 00:00:00', 'value 05') ,('2017-08-25 00:00:00', 'value 06') ,('2017-08-25 00:00:00', 'value 07'); 列,并使用以下语句:

ID

enter image description here

是的,您没有实现数据库中的SELECT * ,CONCAT(CONVERT(CHAR(8), [DateAdded],112), ROW_NUMBER() OVER (PARTITION BY [DateAdded] ORDER BY [RecordID])) AS [ID] FROM [dbo].[DataSource] ; ,并且您需要在每次需要时生成它,但您不必再担心处理密钥的唯一性。< / p>