使用用户自定义类型 CLR UDT
一些复合类型进行范式分解是没有必要的,尤其是一些统一模型的情况下
- DECLARE @i TimeBalance
- SELECT @i
- SELECT @i.ToString()
- SELECT @i.ToTimeString()
- '' m
- SELECT '' s ,
- '37次' m
- SELECT 'Y/2015-1-5/1' s ,
- '包年' m
- SELECT 'M/2015-1-5/11' s ,
- '包个月' m
- SELECT 'D/2015-1-1/7' s ,
- '包天' m
- SELECT '' s ,
- '包天' m
- SELECT 'H/2015-1-5 8:30/10' s ,
- '包小时' m
- )
- SELECT m + '
' + s , - t.ToString() string ,
- t.ToHex() hex ,
- t.ToTimeString() timeString ,
- t.ToValue() value ,
- t.Distance() distance
- m ,
- FROM A
- ) tt

相关资料:
TSql vs. SQL CLR Performance Analysis
- using System;
- using System.Data;
- using System.Data.SqlClient;
- using System.Data.SqlTypes;
- using Microsoft.SqlServer.Server;
- /// <summary>
- /// 时间钱包余额类型
- ///
- /// </summary>
- /// <remarks>
- /// 基于长整型,结构如下:
- /// 包时类型2B,起始时间UTC秒数4B,时间总长2B(单位同类型决定)
- /// <p>包时类型:0不包时1秒2分3时4日5月6年</p>
- /// </remarks>
- /// <see cref="https://msdn.microsoft.com/en-us/library/ms131086.aspx"/>
- [Serializable]
- [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)]
- public
struct TimeBalance : INullable - {
- public
override
string ToString() - {
- switch (type)
- {
- case 0:
- case 1:
- return ToValue().ToString();
- default:
- return
string.Format("{0}/{1}/{2}", (TimeEnum)type, UTCSecondToDateTime(startSecond).ToString("yyyy-MM-dd HH:mm:ss"), value); - }
- }
- public
string ToHex() - {
- return type.ToString("X4") +"
" + startSecond.ToString("X8") + value.ToString("X4"); - }
- public
string ToTimeString() - {
- switch (type)
- {
- case 0:
- case 1:
- return ToValue().ToString();
- default:
- TimeEnum typeEnum = (TimeEnum)type;
- string format = "";
- switch (typeEnum)
- {
- case TimeEnum.S:
- default:
- format = "HH:mm:ss";
- break;
- case TimeEnum.Mi:
- format = "dd HH:mm";
- break;
- case TimeEnum.H:
- format = "MM-dd HH";
- break;
- case TimeEnum.D:
- format = "yyyy-MM-dd";
- break;
- case TimeEnum.M:
- format = "yyyy-MM";
- break;
- case TimeEnum.Y:
- format = "yyyy";
- break;
- }
- return
string.Format("{0}/{1}/{2}", (TimeEnum)type, UTCSecondToDateTime(startSecond).ToString(format), EndTime().ToString(format)); - }
- }
- public
long ToValue() - {
- switch (type)
- {
- case 0:
- case 1:
- return
value; - default:
- return ((long)type << 48) + ((long)startSecond << 16) + value;
- }
- }
- public
static TimeBalance Parse(SqlString s) - {
- if (s.IsNull)
- return Null;
- try
- {
- TimeBalance u = new TimeBalance();
- if (s.Value.Contains("/"))
- {
- u.type = (short)(TimeEnum)Enum.Parse(typeof(TimeEnum), (s.Value.Split('/')[0]));
- u.startSecond = DateTimeToUTCSecond(DateTime.Parse(s.Value.Split('/')[1]));
- u.value = long.Parse(s.Value.Split('/')[2]);
- }
- else
- {
- byte[] bs = BitConverter.GetBytes(long.Parse(s.Value));
- u.type = BitConverter.ToInt16(bs, 6);
- switch (u.type)
- {
- case 0:
- u.value = long.Parse(s.Value);
- break;
- case 1:
- u.value = BitConverter.ToInt16(bs, 0);
- break;
- default:
- u.startSecond = BitConverter.ToInt32(bs, 2);
- u.value = BitConverter.ToInt16(bs, 0);
- break;
- }
- }
- return u;
- }
- catch (Exception ex)
- {
- throw
new Exception(s.Value + "\r\n" + ex.ToString()); - }
- }
- public
bool IsNull - {
- get
- {
- // 在此处放置代码
- return _null;
- }
- }
- public
static TimeBalance Null - {
- get
- {
- TimeBalance h = new TimeBalance();
- h._null = true;
- return h;
- }
- }
- public
long Distance() - {
- return
value; - }
- public DateTime EndTime()
- {
- short v = (short)(value & 0xffff);
- TimeEnum typeEnum = (TimeEnum)type;
- switch (typeEnum)
- {
- // case TimeEnum.N:
- case TimeEnum.S:
- default:
- return UTCSecondToDateTime(startSecond).AddSeconds(v);
- case TimeEnum.Mi:
- return UTCSecondToDateTime(startSecond).AddMinutes(v);
- case TimeEnum.H:
- return UTCSecondToDateTime(startSecond).AddHours(v);
- case TimeEnum.D:
- return UTCSecondToDateTime(startSecond).AddDays(v);
- case TimeEnum.M:
- return UTCSecondToDateTime(startSecond).AddMonths(v);
- case TimeEnum.Y:
- return UTCSecondToDateTime(startSecond).AddYears(v);
- }
- }
- #region 获取UTC
- public
static
int DateTimeToUTCSecond(DateTime dateTime) - {
- return (int)dateTime.ToUniversalTime().Subtract(UTC).TotalSeconds;
- }
- static DateTime UTCSecondToDateTime(int second)
- {
- return UTC.AddSeconds(second).ToLocalTime();
- }
- #endregion
- // 这是占位符成员字段
- public
int startSecond; - public
short type; - public
long
value; - static
readonly DateTime UTC = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Utc); - // 私有成员
- private
bool _null; - }
- public
enum TimeEnum - {
- N = 0,
- T = 1,//Times
- S = 2,
- Mi = 3,
- H = 4,
- D = 5,
- M = 6,
- Y = 7
- }
使用用户自定义类型 CLR UDT的更多相关文章
- 使用用户自定义类型作为map的key
有时候我们想把用户自定义类型作为std::map的键值.方法一)最简单的方法就是实现该自定义类型的<操作符,代码如下:class Foo{public: Foo(int num_) ...
- 内建类型,与用户自定义类型,返回值为const
1对内建类型来说,按值返回的是否为const,是无关紧要的,因为编译器已经不让它成为一个坐直,因为它总是一个值,而不是一个变量(thing in c++ page192) 2当处理用户自定义的类型时, ...
- SQL Server用户自定义类型与统计信息
用户自定义数据类型不支持统计信息! 所以查询对它的查询会慢一些.
- 用户自定义类型《lua程序设计》 28章 笔记
本实例实现一种很简单的类型------布尔数组.C语言可以实现将每个布尔值存储在一个bit中,从而减少内存用量. 必须的一些宏 Code Snippet #defineBITS_PER_WORD (C ...
- Python 中的用户自定义类型
Python中面向对象的技术 Python是面向对象的编程语言,自然提供了面向对象的编程方法.但要给面向对象的编程方法下一个定义,是很困难的.问题关键是理解对象 的含义.对象的含义是广泛的,它是对现实 ...
- 结构体struct、联合体union、枚举类型enum
1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...
- lob结构
lob是什么? 从网上查了好多资料没找到,最后还是同事给我找到了. lob他是这样解释的:LOB专门存储大型对象数据的,类型text.image这些数据类型的数据就是存储在LOB页面 LOB_DATA ...
- 利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)
我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...
- SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...
随机推荐
- Java 8新特性-3 Lambda 表达式
在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差. 在Java 8 之前使用匿名内部类: 例如 interface ITestPrint{ public voi ...
- js ES6 对字符的操作注意事项
1.codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法. function is32Bit(c) { return c.codePointAt(0) > 0xFFF ...
- Hammer.js分析(二)——manager.js
“Manager”是所有识别器实例的容器,它为你设置的元素安装了交互事件监听器,并设置了触摸事件特性. manager.js中的代码会涉及到input.js和recoginzer.js中的内容,这里会 ...
- JavaScript中typeof、toString、instanceof、constructor与in
JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定. 这也意味着你可以使用同一个变量保存不同类型的数据. 最新的 ECMAScrip ...
- Opencv摄像头实时人脸识别
Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...
- 去百度API的百度地图准确叠加和坐标转换的解决方案研究
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前项目上如果要使用百度地图,得加载百度的开发包,然后通过百 ...
- using语法糖详解 2015-01-06 17:45 50人阅读 评论(0) 收藏
前段事件在using外套try catch 突然想到,如果出现异常 会不会执行释放,不执行的话那服务器很可能导致崩溃... 特意上了CSDN问了大神..得到了答案.. Using相等于try catc ...
- Javascript 如何生成Less和Js的Source map
为什么有Source map CSS和JS脚本正变得越来越复杂,为了解决网络瓶颈,大部分源代码都需要经过编译.合并.压缩才能运用到实际环境中.为了减少网络资源占用,源码一般都会经过以下方式处理: 使用 ...
- 【转】App开放接口api安全性—Token签名sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- 基于Metronic的Bootstrap开发框架经验总结(10)--优化Bootstrap图标管理
在基于Bootstrap开发的项目中,鲜艳颜色的按钮,以及丰富的图表是很吸引人的特点,为了将这个特点发挥到极致,可以利用Bootstrap图标抽取到数据库里面,并在界面中进行管理和使用,这样我们可以把 ...