数据库中存储日期的字段类型究竟应该用varchar还是datetime ?
背景:
前段时间在百度经验看到一篇文章《如何在电脑右下角显示你(爱人)的名字》,之前也听过这个小技巧,但没真正动手设置过。所以出于好奇就实践了一下。
设置完成后的效果例如以下。右下角的时间区域添加了我的名字 “Danny” :
以上为背景。
没想到这个小技巧给我带来了麻烦(当然也是一次学习和提高的机会)。
该字符串未被识别伪有效的DateTime
正在做的新闻公布系统。数据库中存储时间的字段类型为datetime类型,而且字段值都是在server端自己主动获取的。想在client以“yyyy-MM-dd HH:mm:ss”的格式显示时间时,出现了一个问题:“该字符串未被识别伪有效的DateTime”:
错误页面例如以下图:
获取异常,异常提示为:
出错关键代码为:
lblCreateTime.Text = Convert.ToDateTime(news.CreateTime).ToString(); //【注】:lblCreate为前端显示页面一个Lable;news为查询后得到的“新闻”实体类,CreateTime为它的一个字段
推測是我本机电脑时间格式的问题,在client获取了一下时间news.CreateTime的值,格式为:“2014/8/23 星期六 Danny 13:10:14”。而该条记录的时间在数据库中存储的值为 “2014-08-2313:10:14”。经过測试,假设news.CreateTime在数据库中存储的类型为varchar(),则不会产生此错误。
于是能够知道。这里时间格式转化的过程是这种:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHV5dXlhbmc2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
在这个过程中。系统推断出从数据库中获取到的值为datetime类型,所以要将获取到的值(比方这里从数据库中获取的时间值为“2014-08-2313:10:14”)转化为本机的时间格式(比方我电脑的时间格式“2014/8/23
星期六 Danny13:10:14”),在进行最后一步格式转化时,系统则无法识别用户自己定义的时间格式(比方这里的“2014/8/23 星期六 Danny13:10:14”),从而报错。
在网上找了两篇总结Asp.net中时间格式转化的文章:asp.net
格式化时间日期、Asp.net中时间格式化的几种方法。
这么多种方法。大体上我把它分为两个方式:在界面代码(*.aspx)上转换
& 在后台代码(*.aspx.cs)上转换。
解决方法
解决问题用了两个办法:
1、假设数据库中存储时间的数据类型为datetime。那就避免在后台代码(*.aspx.cs)中转化时间格式,将格式转化的任务放到界面代码(*.aspx)上。
比方上面的样例中,不管获取的时间是什么格式的,在后台不要对这个时间的值进行不论什么操作(比方赋值等,否则系统会将时间隐式转换),而是直接在界面代码(*.aspx)用DataBinder、Eval等方法来直接进行格式化:
后台关键代码:
<span style="white-space:pre"> </span>DataTable dt = new NewsManager().SelectById(newsid); //这里得到的dt为从直接数据库中查询到的数据
<span style="white-space:pre"> </span> repNews.DataSource =dt;
repNews.DataBind();
前台关键代码:
<span style="white-space:pre"> </span><asp:Repeater ID="repNews" runat="server">
<ItemTemplate>
<p class="con_time">
公布时间:
<%# DataBinder.Eval(Container.DataItem,"createTime","{0:yyyy-MM-dd HH:mm:ss}") %> <%--此处createTime为上面dt中的字段名--%>
</p>
</ItemTemplate>
</asp:Repeater>
事实上。大部分系统中的时间格式。那些格式转化函数还是“认识”的,但假如有的将自己的系统时间格式设置为“2014/8/23 星期六Danny 13:10:14”。有的设置为“2014/8/23 星期六胡玉洋 13:10:14”……,这些函数肯定猜不到那么多中自己定义的情况。
所以,在设计软件的过程中。最好把client这个因素刨除在外,保证各种使用环境的兼容性,时间在数据库中产生。相同显示时也仅仅显示数据库中的时间(避免client的过滤)。
2、将数据库中存储时间的数据类型改为varchar(),只是这时最好让这些时间是数据库中自己主动生成的(一个没有格式的输入也可能会导致输出错误),由于存储类型为varchar()。所以获取到的值也就被觉得是一个字符串。这时在转换时间格式时就少了上图中【将获取的时间转化为client时间格式下的值】的步骤,直接将数据库中的时间字符串进行转化(这时那些转化函数是能识别数据库中的时间函数的),client的时间格式不再影响转换过程。
只是数据库中存储时间的类型假设为字符型也会带来一些麻烦:
数据库中的时间不过用来显示、查找的,那么影响还不算大,但假设对时间字段进行一些算法如计算星期、DateDiff、DateAdd等,那就麻烦了,尤事实上在大型数据查询中转换类型是会影响效率的
总结
数据库中存储日期的字段类型究竟应该用varchar还是datetime ?这两种方法各有优势,datetime能够借用sql函数库中运算函数,添加了时间在各种运算上的效率;而varchar类型则能够在字符编码上显出优势。在 存储的时间将来不须要进行大量计算 的前提下,能够考虑选择varchar类型,反之。选择datetime类型。
数据库中存储日期的字段类型究竟应该用varchar还是datetime ?的更多相关文章
- 数据库中存储日期的字段类型到底应该用varchar还是datetime
将数据库中存储时间的数据类型改为varchar(),这时最好让这些时间是数据库中自动生成的(一个没有格式的输入也可能会导致输出错误),因为存储类型为varchar(),所以获取到的值也就被认为是一个字 ...
- 在mysql数据库中关于日期时间字段的处理
在mysql数据库中关于日期时间字段的处理 在开发中,日期时间字段一般有如下几种设计 假设要获取2013-08-15日到2013-08-16日之间的记录 1. 直接使用日期时间类字段 相关sql语句如 ...
- Visio 2007中进行数据库建模时如何显示字段类型以及概念名称
关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型: 在visio菜单上--->点击数据库--->选项--->文档 打开后选择表这项,在上 ...
- dateline 在数据库中就是 整型字段。date函数是可以转换成可读日期的。
返回数据中的dateline全部用date()函数转换后再返回,是要嵌套循环还是遍历,代码怎么写? //查询我的活动 function user_activity_info_by_uid($uid){ ...
- 使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)
1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...
- django中模型详解-字段类型与约束条件
这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
往Oracle数据库中插入日期型数据(to_date的用法) INSERT INTO FLOOR VALUES ( to_date ( '2007-12-20 18:31:34' , 'YYY ...
- MySQL中TEXT与BLOB字段类型的区别
这篇文章主要介绍了MySQL中TEXT与BLOB字段类型的区别,本文总结了6大区别,需要的朋友可以参考下 在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程 ...
- 通过mybatis向数据库中插入日期数据
遇到的问题: 通过mybatis向数据库中插入日期格式数据,发现只有年月日, 没有小时分钟和秒 当你想在实体类中使用java.util.Date类型,而且还想在数据库中保存时分秒时, 解决办法: 你可 ...
随机推荐
- UEditor配置图片上传
最近项目中需要用到一个图文编辑器功能,因为之前的kingeditor功能过于简陋,所以决定换成Ueditor,前端已经配置好了,这个是后台配置 1,确定前台已经配置好了 2,将编辑器的插件包下载下来, ...
- VC杂记
获得Combobox的状态:向ComboBox发送CB_GETDROPPEDSTATE消息. 格式化字串:char buff[10] ; sprintf(buff,"1+1=%d" ...
- linux c++ 遍历一个目录下的文件名 (包括子目录的文件名)
最近写代码有一个要遍历目录下的每一个文件并取得这个文件的绝对路径的需求, 我们知道linux c++中有system命令所以我在代码中 先生成了一个log,然后去读log文件的每一行文件名,然后给存储 ...
- 获取网络图片的大小 改变 图片色值 灰度什么的方法集合-b
直接上代码了 头文件 // 图片处理 0 半灰色 1 灰度 2 深棕色 3 反色 +(UIImage*)imageWithImage:(UIImage*)image grayLevelTy ...
- GHOST备份
整理日: 2015年2月16日 GHOST Disk2GHO STEP01 STEP02 STEP03 STEP04 STEP05 STEP06 STEP07 STEP08 STEP09 STEP10
- bzoj 1096: [ZJOI2007]仓库建设 斜率優化
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2242 Solved: 925[Submit][Statu ...
- [BZOJ 3894] 文理分科 【最小割】
题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...
- MVC自学系列之一(MVC入门篇)
MVC是如何适用于ASP.NET中的 自从2002年ASP.NET 1.0版本的首次发布,就知道ASP.NET和Web Forms是同样一回事.ASP.NET由抽象两层类所支持: -->Sy ...
- sublime配置python开发
想在sublime里要python shell那种交互或者run module F5 F5 F5下这种效果的话,还是挺容易实现的,windows下的:1. 打开Sublime text 3 安装pac ...
- [LeetCode#201] Bitwise AND of Numbers Range
Problem: Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of al ...