SQL Server 中的日期时间问题

Posted

技术标签:

【中文标题】SQL Server 中的日期时间问题【英文标题】:DateTime issue in SQL Server 【发布时间】:2013-10-01 20:27:48 【问题描述】:

我正在尝试对 MS SQL Server 中已设置的数据库进行 INSERT,该数据库服务器位于共享主机中(godaddy)。

我想要实现的是将一篇文章存储到数据库中,但每次我发布或预览文章时,服务器都会抛出我

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.]
System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam) +5635
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1379
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
System.Data.Common.DbCommand.ExecuteReader() +12
System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +1306
System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +118
         System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +342
System.Data.Linq.StandardChangeDirector.DynamicInsert(TrackedObject item) +145
System.Data.Linq.StandardChangeDirector.Insert(TrackedObject item) +215
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +378
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +372
System.Data.Linq.DataContext.SubmitChanges() +23
sgc.Servicio.CrearServicio.InsertDB(Object sender, EventArgs e) in    CrearArticulo.aspx.cs:114
System.EventHandler.Invoke(Object sender, EventArgs e) +0
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9553178
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9642898
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

我在共享主机中有一个Datetime 类型字段,该字段应该记录文章的日期,顺便说一句,它不会在其他文章表上引发此错误。就这一个,可能是错字什么的?

这是我的代码(引发错误的代码):

public partial class CrearServicio : System.Web.UI.Page

    string tpCont = "1";
    int estatus = 1;
    bool withResponse = true;

    protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)
        
            TextBox1.Attributes.Add("onKeyDown", "textCounter(this, 'counter1', 500)");
            TextBox1.Attributes.Add("onKeyUp", "textCounter(this, 'counter1', 500)");

            datetime.Text = DateTime.Now.ToString("yyyyMMddHHmmss");

            if (Request.QueryString["tpCont"] != null)
            
                tpCont = Request.QueryString["tpCont"];
                volver.HRef = "elegir.aspx?tpCont=" + tpCont;
                volver1.HRef = "elegir.aspx?tpCont=" + tpCont;
            

            ConexionServiciosDataContext db = new ConexionServiciosDataContext();

            tpContinpt.Text = tpCont;

            int role = kernel.getUserRole(User.Identity.Name);

            int tipoUsuario = role;

            if (tipoUsuario == 1 || tipoUsuario == 2)
            
                mainButton.Visible = true;
                saveButton.Visible = true;
                displayButton.Visible = true;
            
        
    

    protected void SaveDBAndDisplay(object sender, EventArgs e)
    
        withResponse = false;

        SaveDB(sender, e);
    

    protected void SaveDB(object sender, EventArgs e)
    
        estatus = 2;

        InsertDB(sender, e);
    

    protected void InsertDB(object sender, EventArgs e)
    
        tpCont = tpContinpt.Text;

        if (TextArea1.Text.Length > 0)
        
            ConexionServiciosDataContext db = new ConexionServiciosDataContext();

            Servicios columna = new Servicios();
            columna.Título = TextBox1.Text.ToString();
            string line = TransformarString(TextArea1.Text.ToString());
            columna.Contenido = line.ToString();

            string[] IDsTitlesLocations =  ;

            db.Servicios.InsertOnSubmit(columna);
            db.SubmitChanges();
        


对不起,如果我写的太多,但我只是坚持这个,也许我应该在服务器上设置日期时间格式?

任何人都可以对此有所了解吗?

【问题讨论】:

错误在哪一行抛出? 好的,我对 aspx.cs 代码进行了编辑,在最后一行 'db.SubmitChanges();' 处抛出错误 请给你的问题一个有意义的标题。 Servicios 有哪些属性? 这是因为您的对象 columna 具有日期时间类型属性,或者以其他方式表 Servicios 具有不为空的日期时间列并且您的代码没有处理为它分配任何值。将当前日期分配给该属性,您的问题将得到解决。 【参考方案1】:

我会假设 Servicios 具有未设置的 DateTime 属性。

DateTimes 不可为空,如果未设置,则默认为 1/1/0001 12:00:00 AM

在调用 db.SubmitChanges() 时,您正尝试将一个值插入到 DateTime 列中,这是 SQL SERVER 支持的较低值,如您的异常所示。

SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

【讨论】:

我猜想,我的意思是,我应该在数据库本身上设置该属性吗?在日期时间表上? 这取决于什么更有意义。您的选择似乎是使该字段可为空,或将其设置为当前日期。 在我得到的日期时间“默认”行 (getdate()) 上,我尝试删除它,但是当我更新它时它并没有改变,顺便说一句,我使表可以为空,仍然没有 @KristianKoci 在使列可以为空后,您必须确保 edm 反映了更改。您的 DateTime 属性现在也应该可以为空。【参考方案2】:

试试DateTime.Now,如果是textfeild DateTime.Now.ToString();,希望能成功。

它在我几乎相同的情况下工作正常。

1/1/0001 12:00:00 AM 等是 sqlServer 的默认值,并且在上面的评论中,如果在删除方法后它什么都不做意味着它没有更新引用或类似的东西。

确保您要删除的内容已被删除,如果没有,则通过更改属性并刷新+检查来强制执行它

【讨论】:

【参考方案3】:

请注意,MS SQL Server 的 DateTime 和 C# DateTime 具有不同 MinValues。

虽然 MS SQL DateTime 仅从 1/1/1753 12:00:00 AM 开始,但 C# DateTime 以 1/1/0001 12:00:00 AM 开始。

我想到了 3 种方法:

    确保在您的代码中,您要保存的对象在保存之前设置了有效的 DateTime 值。其他发帖人已经对此提出了一些建议。

    为数据库端的列添加默认值。对我来说,这似乎是最简单和最干净的方法。您既不需要更改数据类型,也不会影响您的代码,并且您将确保不会(或可以)保存无效日期。

    如果这在您的开发阶段可行,您可以将列的数据类型更改为 DateTime2,这允许日期以 1/1/0001 12:00:00 AM 开头。 MSDN 文档here。

【讨论】:

【参考方案4】:

按照我的说法,应该是这样的:

datetime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

【讨论】:

【参考方案5】:

我不明白您为什么要将日期时间转换为字符串??

 datetime.Text = DateTime.Now.ToString("yyyyMMddHHmmss");

如果您必须在数据库中插入日期时间,那么只需将该日期时间变量传递给插入命令。

DateTime dt = new DateTime();
dt = DateTime.Now.Date;

当您将其插入 DB 时,DB 会将其转换为适当的日期时间格式。 试试看吧。

【讨论】:

以上是关于SQL Server 中的日期时间问题的主要内容,如果未能解决你的问题,请参考以下文章

从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间

SQL Server 2008 中的 Varchar 到日期时间

如何使用 SQL Server 中的日期时间数据设置日期时间本地输入值?

SQL Server 中的日期时间问题

sql server 中两个日期之间的年份以及每个日期在 sql server 中的开始和结束日期

仅从 sql server 中的日期数据类型中获取日期 [重复]