如何使用SQL生成DateTime.Ticks

在项目中我需要使用到一个随机数(Random Number),该随机数将作为 Hashtable 中的 Key 用于唯一索引数据,所以需要保持单机唯一性。

同时该随机数还需要具备可排序性以便对数据进行排序。

此时,我可以考虑使用随机字符串《C#生成MongoDB中的ObjectId》,这里的 ObjectId 具备单机唯一性和可排序性。

但另一个需求是,我需要该随机数为 int 或 long 类型,以便与依赖的 Service 进行通信,部分取代 TransactionId 或 Token 的职责。

所以,很自然的我就想到了时间。

查看了 MSDN 上关于 DateTime.MinValue 和 DateTime.Ticks 的定义,考虑到我所设计的服务每秒不会产生多于 10000000 的数据,

我决定使用 DateTime.Ticks 作为随机数的起始点,这样就有了下面这段代码。

public static class UniqueId
  {
    private static long _sequence = DateTime.UtcNow.Ticks;

    public static long Generate()
    {
      return Interlocked.Increment(ref _sequence);
    }

    public static long Sequence
    {
      get
      {
        return _sequence;
      }
    }
  }

业务逻辑中会将 UniqueId 存储到 SQL Server 数据库中,使用 bigint 类型进行存储。

1 CREATE TABLE [TableName](
2     [UniqueId] [bigint] NOT NULL,
3 );

这样,在数据库中,该 UniqueId 即可作为索引,也可进行排序。

现在问题来了,我需要将一个较老的服务升级到新的服务中,做 Date Migration。

老的服务中没有 UniqueId 逻辑和数据,这就需要我在数据迁移时为每条表数据生成该 UniqueId。

显然,SQL Server 不会帮我做这件事,我需要使用 SQL Script 来生成 UniqueId。

DateTime.Ticks 的定义是:

A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.

1 Tick 等于千万分之一秒,或万分之一毫秒。

The value represents the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001, which represents DateTime.MinValue.

DateTime.Ticks 代表着从时间 "00:00:00.0000000, January 1, 0001" 至当前时间的 Tick 总数。

这样,我们就可以根据其原理通过 SQL 来计算其值。

DECLARE @current_datetime DATETIME;
DECLARE @days_from_0001_to_1900 BIGINT;
DECLARE @ticks_per_millisecond BIGINT;
DECLARE @ticks_per_day BIGINT;
DECLARE @millisecond_of_time BIGINT;
DECLARE @ticks_of_days BIGINT;
DECLARE @ticks_of_time BIGINT;
DECLARE @ticks BIGINT;

SET @current_datetime = GETUTCDATE();
SET @days_from_0001_to_1900 = 693595;
SET @ticks_per_millisecond = 10000;
SET @ticks_per_day = 24 * 3600 * 1000 * @ticks_per_millisecond;
SET @millisecond_of_time =
    DATEPART(MILLISECOND, @current_datetime)
    + (DATEPART(SECOND, @current_datetime)) * 1000
    + (DATEPART(MINUTE, @current_datetime)) * 60000
    + (DATEPART(HOUR, @current_datetime)) * 3600000;
SET @ticks_of_days = CAST(@days_from_0001_to_1900 + DATEDIFF(DAY, 0, @current_datetime) AS BIGINT) * @ticks_per_day;
SET @ticks_of_time = @millisecond_of_time * @ticks_per_millisecond;
SET @ticks = @ticks_of_days + @ticks_of_time;

SELECT @current_datetime, @ticks

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/SQLServer/

这段 SQL 脚本的运行结果是:

我们通过下面这段 C# 代码来验证结果。

class Program
  {
    static void Main(string[] args)
    {
      DateTime d1 = new DateTime(2014, 04, 01, 02, 52, 54, 153, DateTimeKind.Utc);
      DateTime d2 = DateTime.Parse("2014-04-01 02:52:54.153");
      DateTime d3 = DateTime.Parse("2014-04-01 02:52:54.153",
        CultureInfo.CurrentCulture, DateTimeStyles.AdjustToUniversal);

      Console.WriteLine(d1.Ticks);
      Console.WriteLine(d2.Ticks);
      Console.WriteLine(d3.Ticks);

      Console.ReadKey();
    }
  }

瞧,它们的结果一致为 635319175741530000。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, sql server 2014
, 随机数
, datetime
, tick
, androidtime tick
, SqlServer2014
, declare
, ''''800a0001''''
, bigint
UniqueID
datetime.ticks、c datetime ticks、datetime.now.ticks、c ticks 转 datetime、datetime ticks 毫秒,以便于您获取更多的相关知识。

时间: 2024-10-12 04:59:30

如何使用SQL生成DateTime.Ticks的相关文章

ASP.NET中实现根据匿名类、datatable、sql生成实体类

  这篇文章主要介绍了ASP.NET中实现根据匿名类.datatable.sql生成实体类,这个小小工具类非常实用,使用起来也很方便,需要的朋友可以参考下 在开发中可能会遇到这几种情况: 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类 为了解决上面的不便之处,我封装了一个实体生成类,可以扔到

pl/sql-用PL/SQL生成二维码并以图片形式存入数据库表中

问题描述 用PL/SQL生成二维码并以图片形式存入数据库表中 在数据库中创建一张表 -- Create table create table QRCode ( id varchar2(10), img blob ) tablespace USERS storage ( initial 64K minextents 1 maxextents unlimited ); 用PL/SQL生成二维码并以图片形式存入表QRCode的img字段中

linq to sql生成not in语句的小技巧

以前一直觉得linq to sql生成类似where id not in (1,3,5)或where id not in (select id from ...)这样的条件不是很方便,每次我都是把条件ID事先取到一个数组里,然后用 !Arr.Contains(c.Id)这样处理,今天突然发现这样好傻,其实可以完全直接用linq写成一句,贴个示例在这里,以后备查 from a in TableA where !(from b in TableB Where ... select b.Id).Con

对于多个基本表不支持动态sql生成,怎么解决的,求解答。。。。

问题描述 C#的winform程序,我做的学生管理系统.学生表,成绩表,课程表.操作学生表的时候(插入等),就显示出对于多个基本表不支持动态sql生成的信息,我知道这是由于有外键的关系,表与表之间有联系,怎么解决?我觉得肯定是同时进行操作这三张表才可以,怎么弄?同时写三条sql语句?我显示信息是用的datagridview控件.求解答............ 解决方案 解决方案二:插入.改写操作在数据逻辑里做拆分,或者做成存储过程在数据库里面做拆分,真正该插入到哪儿还是你自己确定,不是数据库.

SqlBuilder (OpenHMS) 2.0.10发布 SQL生成库

SqlBuilder是一个SQL生成库,它用于减少Java程序中生成SQL查询的负担.它使用一种编程语言(Java)来生成另一种语言的代码(即SQL).它的特点是在轻量级.易于使用的Java对象中封装SQL语法,遵循类似于StringBuilder 的 builder范例.它能够改变很多常见的SQL语法和运行时错误到Java编译时错误. 嵌入在Java程序中的一个很简单的SQL SELECT查询代码,如下: // assuming a variety of pre defined string

sql生成(mssql对于表的delete和update做备份的触发器)代码的存储过程

GO /****** 对象: StoredProcedure [dbo].[pro_GenerateTrigger] 脚本日期: 08/13/2012 10:10:16 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pro_GenerateTrigger]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[pro_Generat

Sql中将datetime转换成字符串的方法(CONVERT)_MsSql

一.回顾一下CONVERT()的语法格式:CONVERT (<data_ type>[ length ], <expression> [, style])二.这里注重说明一下style的含义:style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式:一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varc

请问我用一条sql生成了一个动态bean,然后想用反射来掉这个javabean,但是它们是在一个线程中掉不到那个javabean.

问题描述 请问我用一条sql生成了一个动态bean,然后想用反射来掉这个javabean,但是它们是在一个线程中掉不到那个javabean.请帮帮忙看是怎样设计能生成bean,又能反射到这个bean的实例?? 解决方案 解决方案二:不用反射,放到静态变量里面去就可以在另一个线程里面渠道它了解决方案三:例如:我生成了一个test.bean.testbean.java刚生成完程序没结束,我就要反射这个bean,使用反射后返回个List里面放有testbean实体我要遍历这个类,就编译错误..因为我这

sql中datetime转换成varchar字符型多种方法

写了这个小桌面程序,以帮助我记得是什么风格112没有,或如何得到HH:MM AM / PM一个DATETIME列.基本上,它是有效的样式编号填充一个表,然后通过这些循环,并产生每个样式的结果(和产生这一结果的语法),鉴于当前的日期和时间. 是的,它使用游标.这是一个辅助功能,不是你会使用生产环境中的一部分,所以我不认为对性能的影响应该是一个大问题.但如果你有  代码如下 复制代码 USE tempdb; GO CREATE PROCEDURE dbo.help_DateTimeFormats