【问题标题】:Dateformat mismatch in sql server and C# codesql server 和 C# 代码中的日期格式不匹配
【发布时间】:2010-02-12 03:54:34
【问题描述】:

我有问题。

我有一个 C# 应用程序,使用 SQL SERVER 2005 作为后端。

问题在于根据日期获取正确的记录。

前端代码是

if (string.IsNullOrEmpty(txtFromDate.Text)) 
    SelectCmd.Parameters[0].Value = DBNull.Value;
else 
    SelectCmd.Parameters[0].Value = txtFromDate.Text;

现在如果我在查询分析器中运行usp_NewGetUserDetail '03/04/2010',我就能得到正确的记录。

所以我非常确信我的 SP 是正确的(我已经测试了很多变体)。

但如果从前端代码(SelectCmd.Parameters[0].Value = "03/04/2010";) 传递相同的值,我会得到一些意想不到的记录。我的意思是,不在日期范围内的记录。

我猜是后端和前端的日期格式有些不匹配。

如果我错过了解决此问题需要提供的一些信息,请告诉我

请帮忙。

【问题讨论】:

    标签: sql-server tsql datetime c#-3.0


    【解决方案1】:

    在 SQL Server 上处理日期是一项棘手的工作,因为大多数格式都依赖于语言和区域设置。正如 Adam 已经提到的 - 您应该尽量避免将日期作为字符串处理 - 它确实会变得混乱,并且使用 DateTime(在 .NET 和 T-SQL 中)更安全、更容易。

    但如果您必须使用字符串,请注意以下几点:像 02/05/2010 这样的日期在某些地方会被解释为 2010 年 2 月 5 日,在其他地方会被解释为 2010 年 5 月 2 日。所以无论你在做什么 - 你总是会遇到一个设置不同并得到不同结果的人。

    这里的做法是使用ISO-8601 format,它独立于所有区域设置和语言设置,并且始终有效。

    因此,对于您的日期,始终使用 YYYYMMDD 格式 - 首先,它始终有效,其次,使用该格式,您会获得“自然”的排序行为 - 按年份排序,然后是月,然后是日。

    【讨论】:

      【解决方案2】:

      没有必要将日期作为字符串传递,不应该你。将参数的值设置为代表您想要的日期的DateTime 对象,而不是它的字符串表示形式。

      【讨论】:

      • 我尝试了您的建议,例如 if (string.IsNullOrEmpty(txtFromDate.Text)) SelectCmd.Parameters[0].Value = DBNull.Value;否则 SelectCmd.Parameters[0].Value = Convert.ToDateTime(txtFromDate.Text);但结果相同
      【解决方案3】:

      试试这样的:

      DateTime fromDate;
      if (DateTime.TryParse(txtFromDate.Text, out fromDate))
      {
          SelectCmd.Parameters[0].Value = fromDate
      }
      else
      {
          SelectCmd.Parameters[0].Value = DBNull.Value;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        相关资源
        最近更新 更多