一些复合类型进行范式分解是没有必要的,尤其是一些统一模型的情况下

   
 

  1. SET NOCOUNT ON
  2. DECLARE @i TimeBalance
  3. SET @i = CAST('D/2015-1-1/7' AS TimeBalance)
  4. SELECT @i
  5. SELECT @i.ToString()
  6. SELECT @i.ToTimeString()
  7. SELECT @i.Distance() AS Distance;
  8.  
  9. WITH a AS ( SELECT '' s ,
  10.                         '' m
  11.                UNION
    ALL
  12.                SELECT '' s ,
  13.                         '37次' m
  14.                UNION
    ALL
  15.                SELECT 'Y/2015-1-5/1' s ,
  16.                         '包年' m
  17.                UNION
    ALL
  18.                SELECT 'M/2015-1-5/11' s ,
  19.                         '包个月' m
  20.                UNION
    ALL
  21.                SELECT 'D/2015-1-1/7' s ,
  22.                         '包天' m
  23.                UNION
    ALL
  24.                SELECT '' s ,
  25.                         '包天' m
  26.                UNION
    ALL
  27.                SELECT 'H/2015-1-5 8:30/10' s ,
  28.                         '包小时' m
  29.              )
  30.     SELECT m + '
    ' + s ,
  31.             t.ToString() string ,
  32.             t.ToHex() hex ,
  33.             t.ToTimeString() timeString ,
  34.             t.ToValue() value ,
  35.             t.Distance() distance
  36.     FROM ( SELECT s ,
  37.                         m ,
  38.                         CAST (s AS TimeBalance) t
  39.               FROM A
  40.             ) tt

 

 
 

     
 

     
 

   
 

相关资料:

   
 

TSql vs. SQL CLR Performance Analysis

   
 

CLR 集成的性能

操作 UDT 数据

   
 

  1.      using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Data.SqlTypes;
  5. using Microsoft.SqlServer.Server;
  6.  
  7. /// <summary>
  8. /// 时间钱包余额类型
  9. ///
  10. /// </summary>
  11. /// <remarks>
  12. /// 基于长整型,结构如下:
  13. /// 包时类型2B,起始时间UTC秒数4B,时间总长2B(单位同类型决定)
  14. /// <p>包时类型:0不包时1秒2分3时4日5月6年</p>
  15. /// </remarks>
  16. /// <see cref="https://msdn.microsoft.com/en-us/library/ms131086.aspx"/>
  17. [Serializable]
  18. [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)]
  19. public
    struct TimeBalance : INullable
  20. {
  21.     public
    override
    string ToString()
  22.     {
  23.         switch (type)
  24.         {
  25.             case 0:
  26.             case 1:
  27.                 return ToValue().ToString();
  28.             default:
  29.                 return
    string.Format("{0}/{1}/{2}", (TimeEnum)type, UTCSecondToDateTime(startSecond).ToString("yyyy-MM-dd HH:mm:ss"), value);
  30.         }
  31.  
  32.  
  33.     }
  34.     public
    string ToHex()
  35.     {
  36.         return type.ToString("X4") +"
    " + startSecond.ToString("X8") + value.ToString("X4");
  37.     }
  38.     public
    string ToTimeString()
  39.     {
  40.  
  41.         switch (type)
  42.         {
  43.             case 0:
  44.             case 1:
  45.                 return ToValue().ToString();
  46.             default:
  47.                 TimeEnum typeEnum = (TimeEnum)type;
  48.                 string format = "";
  49.                 switch (typeEnum)
  50.                 {
  51.                     case TimeEnum.S:
  52.                     default:
  53.                         format = "HH:mm:ss";
  54.                         break;
  55.                     case TimeEnum.Mi:
  56.                         format = "dd HH:mm";
  57.                         break;
  58.                     case TimeEnum.H:
  59.                         format = "MM-dd HH";
  60.                         break;
  61.                     case TimeEnum.D:
  62.                         format = "yyyy-MM-dd";
  63.                         break;
  64.                     case TimeEnum.M:
  65.                         format = "yyyy-MM";
  66.                         break;
  67.                     case TimeEnum.Y:
  68.                         format = "yyyy";
  69.                         break;
  70.  
  71.  
  72.                 }
  73.                 return
    string.Format("{0}/{1}/{2}", (TimeEnum)type, UTCSecondToDateTime(startSecond).ToString(format), EndTime().ToString(format));
  74.  
  75.         }
  76.     }
  77.  
  78.     public
    long ToValue()
  79.     {
  80.         switch (type)
  81.         {
  82.             case 0:
  83.             case 1:
  84.                 return
    value;
  85.  
  86.             default:
  87.                 return ((long)type << 48) + ((long)startSecond << 16) + value;
  88.         }
  89.     }
  90.  
  91.     public
    static TimeBalance Parse(SqlString s)
  92.     {
  93.         if (s.IsNull)
  94.             return Null;
  95.         try
  96.         {
  97.             TimeBalance u = new TimeBalance();
  98.  
  99.             if (s.Value.Contains("/"))
  100.             {
  101.                 u.type = (short)(TimeEnum)Enum.Parse(typeof(TimeEnum), (s.Value.Split('/')[0]));
  102.                 u.startSecond = DateTimeToUTCSecond(DateTime.Parse(s.Value.Split('/')[1]));
  103.                 u.value = long.Parse(s.Value.Split('/')[2]);
  104.             }
  105.             else
  106.             {
  107.  
  108.                 byte[] bs = BitConverter.GetBytes(long.Parse(s.Value));
  109.                 u.type = BitConverter.ToInt16(bs, 6);
  110.                 switch (u.type)
  111.                 {
  112.                     case 0:
  113.                         u.value = long.Parse(s.Value);
  114.                         break;
  115.                     case 1:
  116.                         u.value = BitConverter.ToInt16(bs, 0);
  117.                         break;
  118.                     default:
  119.  
  120.                         u.startSecond = BitConverter.ToInt32(bs, 2);
  121.                         u.value = BitConverter.ToInt16(bs, 0);
  122.                         break;
  123.                 }
  124.             }
  125.  
  126.             return u;
  127.         }
  128.         catch (Exception ex)
  129.         {
  130.             throw
    new Exception(s.Value + "\r\n" + ex.ToString());
  131.         }
  132.     }
  133.  
  134.  
  135.  
  136.  
  137.     public
    bool IsNull
  138.     {
  139.         get
  140.         {
  141.             // 在此处放置代码
  142.             return _null;
  143.         }
  144.     }
  145.  
  146.     public
    static TimeBalance Null
  147.     {
  148.         get
  149.         {
  150.             TimeBalance h = new TimeBalance();
  151.             h._null = true;
  152.             return h;
  153.         }
  154.     }
  155.  
  156.  
  157.     public
    long Distance()
  158.     {
  159.         return
    value;
  160.  
  161.     }
  162.  
  163.     public DateTime EndTime()
  164.     {
  165.         short v = (short)(value & 0xffff);
  166.         TimeEnum typeEnum = (TimeEnum)type;
  167.         switch (typeEnum)
  168.         {
  169.             // case TimeEnum.N:
  170.  
  171.             case TimeEnum.S:
  172.             default:
  173.                 return UTCSecondToDateTime(startSecond).AddSeconds(v);
  174.             case TimeEnum.Mi:
  175.                 return UTCSecondToDateTime(startSecond).AddMinutes(v);
  176.             case TimeEnum.H:
  177.                 return UTCSecondToDateTime(startSecond).AddHours(v);
  178.             case TimeEnum.D:
  179.                 return UTCSecondToDateTime(startSecond).AddDays(v);
  180.             case TimeEnum.M:
  181.                 return UTCSecondToDateTime(startSecond).AddMonths(v);
  182.             case TimeEnum.Y:
  183.                 return UTCSecondToDateTime(startSecond).AddYears(v);
  184.  
  185.         }
  186.     }
  187.  
  188.     #region 获取UTC
  189.  
  190.     public
    static
    int DateTimeToUTCSecond(DateTime dateTime)
  191.     {
  192.         return (int)dateTime.ToUniversalTime().Subtract(UTC).TotalSeconds;
  193.     }
  194.  
  195.     static DateTime UTCSecondToDateTime(int second)
  196.     {
  197.         return UTC.AddSeconds(second).ToLocalTime();
  198.     }
  199.     #endregion
  200.  
  201.     // 这是占位符成员字段
  202.     public
    int startSecond;
  203.     public
    short type;
  204.     public
    long
    value;
  205.     static
    readonly DateTime UTC = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Utc);
  206.     // 私有成员
  207.     private
    bool _null;
  208. }
  209. public
    enum TimeEnum
  210. {
  211.     N = 0,
  212.     T = 1,//Times
  213.     S = 2,
  214.     Mi = 3,
  215.     H = 4,
  216.     D = 5,
  217.     M = 6,
  218.     Y = 7
  219. }

 

 
 

 
 

 
 

     
 

    

使用用户自定义类型 CLR UDT的更多相关文章

  1. 使用用户自定义类型作为map的key

    有时候我们想把用户自定义类型作为std::map的键值.方法一)最简单的方法就是实现该自定义类型的<操作符,代码如下:class Foo{public:    Foo(int num_)     ...

  2. 内建类型,与用户自定义类型,返回值为const

    1对内建类型来说,按值返回的是否为const,是无关紧要的,因为编译器已经不让它成为一个坐直,因为它总是一个值,而不是一个变量(thing in c++ page192) 2当处理用户自定义的类型时, ...

  3. SQL Server用户自定义类型与统计信息

    用户自定义数据类型不支持统计信息! 所以查询对它的查询会慢一些.

  4. 用户自定义类型《lua程序设计》 28章 笔记

    本实例实现一种很简单的类型------布尔数组.C语言可以实现将每个布尔值存储在一个bit中,从而减少内存用量. 必须的一些宏 Code Snippet #defineBITS_PER_WORD (C ...

  5. Python 中的用户自定义类型

    Python中面向对象的技术 Python是面向对象的编程语言,自然提供了面向对象的编程方法.但要给面向对象的编程方法下一个定义,是很困难的.问题关键是理解对象 的含义.对象的含义是广泛的,它是对现实 ...

  6. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  7. lob结构

    lob是什么? 从网上查了好多资料没找到,最后还是同事给我找到了. lob他是这样解释的:LOB专门存储大型对象数据的,类型text.image这些数据类型的数据就是存储在LOB页面 LOB_DATA ...

  8. 利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)

    我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...

  9. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

随机推荐

  1. OracleDBA之用户管理

    再分享一下Oracle中对用户的管理,以下这些东西是我的麦库上存的当时学Oracle的学习笔记今天拿出来和大家分享一下,转载请注明出处,下面用的Oracle的版本是10g,用的时WinServer20 ...

  2. canvas学习和面向对象(二)

    Canvas 学习(二) 上一篇Canvas 学习(一)中我是用canvas绘制了一些基本和组合的图形. 现在开始绘制图片和动画帧,以及面向对象的升级版本. 还是一样,看代码,所有的代码都托管在git ...

  3. objective-c 语法快速过(4)

    oc 里的字符串 字符串的快速创建(最简单的方法) NSStirng *str = @“Hello”;//oc的字符串都是@“”形式的 oc的字符串也是类的对象,是NSString类的对象,创建没有那 ...

  4. EasyUI管理后台模板(附源码)

    下载地址:http://files.cnblogs.com/wyguo/easyui_demo.zip

  5. 包含块( Containing block ) 转自W3CHelp

    包含块简介 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称作是包含块( containing block ). 一般来说,(元素)生成的框会扮演它子孙元素包含块 ...

  6. Cesium原理篇:1最长的一帧之渲染调度

    原计划开始着手地形系列,但发现如果想要从逻辑上彻底了解地形相关的细节,那还是需要了解Cesium的数据调度过程,这样才能更好的理解,因此,打算先整体介绍一下Cesium的渲染过程,然后在过渡到其中的两 ...

  7. WebGIS中矢量切图的初步研究

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在GIS领域,金字塔技术一直是一个基础性技术,WMTS规范专 ...

  8. (六)WebGIS中地图瓦片在Canvas上的拼接显示原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在之前的五个章节中,我们在第一章节里介绍了WebGIS的基本 ...

  9. 理解JAVASCRIPT 闭包

    最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念“闭包”. 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这 ...

  10. Java继承与组合

    Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...