目錄
背景:
该字符串未被识别伪有效的DateTime
解决方法
总结
首頁 資料庫 mysql教程 数据库中存储日期的字段类型到底应该用varchar还是datetime?

数据库中存储日期的字段类型到底应该用varchar还是datetime?

Jun 07, 2016 pm 04:01 PM
varchar 欄位 儲存 資料庫 日期 類型

背景: 前段时间在百度经验看到一篇文章《怎样在电脑右下角显示你(爱人)的名字》,之前也听过这个小技巧,但没真正动手设置过,所以出于好奇就实践了一下。 设置完毕后的效果如下,右下角的时间区域增加了我的名字 Danny : 以上为背景。没想到这个小技巧给

背景:

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

设置完毕后的效果如下,右下角的时间区域增加了我的名字 “Danny” :

\

以上为背景。没想到这个小技巧给我带来了麻烦(当然也是一次学习和提高的机会)。

该字符串未被识别伪有效的DateTime

正在做的新闻发布系统,数据库中存储时间的字段类型为datetime类型,并且字段值都是在服务器端自动获取的。想在客户端以“yyyy-MM-dd HH:mm:ss”的格式显示时间时,出现了一个问题:“该字符串未被识别伪有效的DateTime”:

错误页面如下图:

\

出错关键代码为:

lblCreateTime.Text = Convert.ToDateTime(news.CreateTime).ToString();  //【注】:lblCreate为前端显示页面一个Lable;news为查询后得到的“新闻”实体类,CreateTime为它的一个字段
登入後複製

猜测是我本机电脑时间格式的问题,在客户端获取了一下时间news.CreateTime的值,格式为:“2014/8/23 星期六 Danny 12:42:10”,而该条记录的时间在数据库中存储的值为 “2014-08-23 12:42:10”。经过测试,如果news.CreateTime在数据库中存储的类型为varchar(),则不会产生此错误。于是可以知道,这里时间格式转化的过程是这样的:

\

在这个过程中,系统判断出从数据库中获取到的值为datetime类型,所以要将获取到的值(比如这里从数据库中获取的时间值为“2014-08-23 12:42:10”)转化为本机的时间格式(比如我电脑的时间格式“2014/8/23 星期六 Danny 12:42:10”),在进行最后一步格式转化时,系统则无法识别用户自定义的时间格式(比如这里的“2014/8/23 星期六 Danny 12:42:10”),从而报错。

在网上找了两篇总结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 12:42:10”,有的设置为“2014/8/23 星期六胡玉洋 12:42:10”……,这些函数肯定猜不到那么多中自定义的情况。

所以,在设计软件的过程中,最好把客户端这个因素刨除在外,保证各种使用环境的兼容性,时间在数据库中产生,同样显示时也只显示数据库中的时间(避免客户端的过滤)。

2、将数据库中存储时间的数据类型改为varchar(),不过这时最好让这些时间是数据库中自动生成的(一个没有格式的输入也可能会导致输出错误),因为存储类型为varchar(),所以获取到的值也就被认为是一个字符串,这时在转换时间格式时就少了上图中【将获取的时间转化为客户端时间格式下的值】的步骤,直接将数据库中的时间字符串进行转化(这时那些转化函数是能识别数据库中的时间函数的),客户端的时间格式不再影响转换过程。

不过数据库中存储时间的类型如果为字符型也会带来一些麻烦:

数据库中的时间仅仅是用来显示、查找的,那么影响还不算大,但如果对时间字段进行一些算法如计算星期、DateDiff、DateAdd等,那就麻烦了,尤其实在大型数据查询中转换类型是会影响效率的

总结

数据库中存储日期的字段类型到底应该用varchar还是datetime ?这两种方法各有优势,datetime可以借用sql函数库中运算函数,增加了时间在各种运算上的效率;而varchar类型则可以在字符编码上显出优势。在 存储的时间将来不需要进行大量计算 的前提下,可以考虑选择varchar类型,反之,选择datetime类型。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

微博怎麼能按日期找以前的微博_微博按日期找以前的微博方法 微博怎麼能按日期找以前的微博_微博按日期找以前的微博方法 Mar 30, 2024 pm 07:26 PM

微博怎麼能按日期找以前的微博_微博按日期找以前的微博方法

PPT講義列印自動出現的日期進行去除的操作方法 PPT講義列印自動出現的日期進行去除的操作方法 Mar 26, 2024 pm 08:16 PM

PPT講義列印自動出現的日期進行去除的操作方法

Go語言如何實作資料庫的增刪改查操作? Go語言如何實作資料庫的增刪改查操作? Mar 27, 2024 pm 09:39 PM

Go語言如何實作資料庫的增刪改查操作?

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

在PHP中使用MySQLi建立資料庫連線的詳盡教學

Hibernate 如何實作多型映射? Hibernate 如何實作多型映射? Apr 17, 2024 pm 12:09 PM

Hibernate 如何實作多型映射?

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片

深入解析HTML如何讀取資料庫 深入解析HTML如何讀取資料庫 Apr 09, 2024 pm 12:36 PM

深入解析HTML如何讀取資料庫

Golang 函數傳回值的型別是什麼? Golang 函數傳回值的型別是什麼? Apr 13, 2024 pm 05:42 PM

Golang 函數傳回值的型別是什麼?

See all articles