背景:

前段时间在百度经验看到一篇文章《如何在电脑右下角显示你(爱人)的名字》,之前也听过这个小技巧,但没真正动手设置过。所以出于好奇就实践了一下。

设置完成后的效果例如以下。右下角的时间区域添加了我的名字 “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(),则不会产生此错误。

于是能够知道。这里时间格式转化的过程是这种:

在这个过程中。系统推断出从数据库中获取到的值为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类型。

转载于:https://www.cnblogs.com/zfyouxi/p/5287045.html

数据库中存储日期的字段类型究竟应该用varchar还是datetime ?相关推荐

  1. 往mysql数据库中存当前日期_在MySQL数据库中存储日期的最简单方法是什么?

    要在MySQL中存储日期,请使用STR_TO_DATE()方法-insert into yourTableName values(STR_TO_DATE('yourDate', '%d/%m/%Y') ...

  2. php mysql 时间字段_php – MySQL中各种日期/时间字段类型的优...

    > TIMESTAMP存储在MySQL专有方法中(尽管它基本上只是一个由年,月,日,小时,分钟和秒组成的字符串),此外,只要插入或更改记录,TIMESTAMP类型的字段就会自动更新.显式字段值给 ...

  3. MySQL中的日期和时间类型

    文章目录 1 MySQL中的日期和时间类型 1 MySQL中的日期和时间类型 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型.其中,YEAR类型表示年, ...

  4. java向mysql写入数据慢_通过java代码往mysql数据库中写入日期相关数据少13个小时...

    通过show variables like '%time_zone%'; 查看时区: CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard ...

  5. mysql gettimestamp_使用mysql数据库,存储日期字段使用timestamp类型的时候,取出来的数据最后面会多一个.0 【解决方案】...

    mysql数据库,存储日期字段使用timestamp类型的时候,取出来的数据最后面会多一个.0 . 看似是YYYY-MM-DD HH:MM:SS,但其实应该是yyyy-MM-dd hh:mm:ss.f ...

  6. 数据库中的日期时间类型

    前言: 大家好, 这里是小小! 今天, 实验室的一个学长发现我提交的一次代码有问题! 差点以为要被特殊关心, 好了说正事了! 看到数据库中时间日期类型, 很多人就会说了哈, 直接存字符串String类 ...

  7. 逆袭之路——python 数据库字符编码与配置、存储引擎、字段类型及约束条件【day46】

    今日内容概要 字符编码与配置文件介绍 存储引擎 MySQL字段类型 MySQL字段约束条件 今日内容详细 一. 字符编码与配置文件 # 查看MySQL默认字符编码\s""" ...

  8. wordPress数据结构 数据库中的表、字段、类型及说明

    wordPress数据结构 数据库中的表.字段.类型及说明 WordPress数据库中的表.字段.类型及说明 wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: wp_c ...

  9. Visio 2007中进行数据库建模时如何显示字段类型以及概念名称

    关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型:   在visio菜单上--->点击数据库--->选项--->文档    打开后选择表这项,在上 ...

最新文章

  1. ionic中的后退方法
  2. Android-上传图片(-)_HttpURLConnection
  3. 稀疏性和L1正则化基础 Sparsity and Some Basics of L1 Regularization
  4. 举例详解PHP归并排序的实现
  5. 系统架构师学习笔记_第十四章_连载
  6. TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
  7. Hyper-v 2016 VHD Set
  8. 【搜索引擎】lucene事务
  9. Vue优化策略_项目发布_01
  10. Android投屏(屏幕共享)设计需要考虑的关键因素
  11. 代码评审常见问题总结【持续更新】
  12. STM32——FLASH闪存编程原理与步骤
  13. android 焦点丢失,RecyclerView更新数据时焦点丢失(android bug)
  14. c# 语音卡控制--语音卡实现电话录音
  15. 笔记本的无线wifi共享给台式机、服务器上网
  16. 从外观上如何识别单模和多模光纤
  17. 唐朝一体机屏幕显示变红
  18. 常用英语口语句型100句
  19. 计算机丢失softwareinspect,logo1 systemInspect山泉查不到。。。和顶的又不一样[求助】...
  20. Hibernate开发之创建POJO-配置文件-映射文件

热门文章

  1. MFC之进度条CProgressCtrl
  2. 针对测试行业,新人的一些建议:我适合做测试吗?
  3. 关于GPU-driver for linux的资料
  4. 在HTML中使用CSS美化网页的三种方法
  5. 未来智能社会的一砖一瓦都需要今天我们一点点的探索发现!
  6. Spring内核研究-通过工厂注入
  7. OVS数据库操作(四十七)
  8. 在matlab中有几种获得帮助的途径,matlab经典习题及解答
  9. 阿里一道Java并发面试题 (详细分析篇)
  10. 在.NET中使用脚本引擎