【问题标题】:dates behaving differently on different dbs?日期在不同的数据库上表现不同?
【发布时间】:2011-02-21 16:01:06
【问题描述】:

我有一个 asp.net 网页,上面有一个 jQuery 日期选择器。

我在英国,所以当我输入 28/02/2010 时,我希望它解析为 28th Feb 2010

这在我的本地开发环境中按预期工作 - 但在我们的 QA 或类似产品的环境中 - 或其他开发机器之一。在这些情况下,它似乎试图将其解析为美国日期格式 - 并且由于超出范围而无法验证。

jQuery 似乎每次都生成正确的日期 - 这让我认为这可能是数据库问题。

我使用的是SQL Server 2005,我的排序规则是Latin1_General_CI_AS,我的同事使用的是排序规则SQL_Latin1_General_CP1_CI_AS,并且是中文的。

鉴于我们无法控制 prod SQL Server 安装(只是我们的数据库),以标准方式使其工作的最佳方法是什么?更改数据库设置,或使用它的代码?

提前致谢! - L

[编辑以添加代码信息]

这是我调用日期选择器的视图代码:

 <%=Html.TextBox("DateOfBirth", Model.DateOfBirth.ToShortDateString(), new { @class = "datepicker" })%>

这里是日期选择器的 js:

DatePickerSettings = {
    setup: function () {
        $(".datepicker").datepicker({
            dateFormat: 'dd/mm/yy',
            changeMonth: true,
            changeYear: true
        });
    }
};

这就是我在模型中指定日期的方式:

[Required]
[DisplayName("Date of Birth")]
public virtual DateTime DateOfBirth { get; set; }

日期在控制器和存储库中显示正确...直到它到达数据库。

谢谢:)

【问题讨论】:

  • 您没有告诉我们有关您用来与数据库通信的代码的任何信息。示例代码真的很有帮助。您也没有提到您在 middle 位 - ASP.NET - 在 jQuery 和数据库之间看到的数据。
  • @Jon - 谢谢我现在更新了。

标签: asp.net sql-server collation


【解决方案1】:

我希望等到您用更多信息更新问题后,但正如我看到的一些答案建议您更改用于与数据库对话的 string 格式。 ..

不要在 SQL 查询中将日期作为原始文本发送。

使用参数化查询,这意味着您根本不需要担心格式化值。然后,您只需确保可以在浏览器和 ASP.NET 之间获取正确的日期格式。

除此之外,如果您直接在 SQL 查询中包含用户数据,您通常会面临 SQL 注入攻击。 总是使用参数化查询(除非您的网络应用真的是“运行此 SQL”测试工具...)

如果您已经在使用参数化查询,那么问题很可能出在浏览器和 ASP.NET 之间,与数据库部分无关。分而治之:在数据通过不同层(浏览器、jQuery、ASP.NET 等)时追踪数据,直到找出问题所在。在您知道问题出在哪里之前,甚至不要考虑修复。

【讨论】:

  • 我将日期作为 DateTime 传递,而不是字符串 - 在数据进入数据库之前,它看起来确实很好。调查仍在继续:)
  • @lainie:如果 ASP.NET 中的 DateTime 是正确的,那么它真的应该在数据库中没问题。你能告诉我们用于插入数据库的代码吗?
  • 很快就会更新,我现在正在从有问题的机器上收集数据(我希望它也被我的机器损坏了;)
  • @lainie:这与您在关于 DateTime 正确进入 ASP.NET 的问题中所说的内容不符...
【解决方案2】:

您的网页是否了解文化? 您可以确定不同浏览器(区域设置)的 UI Cutlure 信息,并让您的 ASP.NET Culture 保持不变。

Culture 值决定了依赖于文化的函数的结果,例如日期、数字和货币格式等。 UICulture 值决定了为页面加载哪些资源

查看此 MSDN 链接: 如何:设置 ASP.NET 网页全球化的文化和 UI 文化

http://msdn.microsoft.com/en-us/library/bz9tc508(v=VS.85).aspx

【讨论】:

  • @lainie:这与“控制器和存储库中的日期显示正确”有什么关系?
  • @Jon 我正在使用二手调试材料 - DateTime 对象只是表面上被询问过。感谢您昨天的帮助:)
【解决方案3】:

使用CONVERT 将日期格式更改为所有环境都接受的标准。

CAST and CONVERT

【讨论】:

    【解决方案4】:

    我必须查看解释日期的代码才能确定,但​​可能怀疑是运行代码的机器上的区域和语言设置。确保针对您所在的地区进行了适当的设置。

    但是,如果您无法更改服务器上的设置,您可能应该在 SQL Server 中显式使用 CAST 或 CONVERT 强制它以您期望输入数据的区域特定方式对其进行解析。

    【讨论】:

    • 谢谢 - 我已经确认这些设置在所有环境中都是相同的,但问题仍然存在......
    【解决方案5】:

    您还需要检查您的 ASP.Net 层,看看它在运行什么。

    检查机器配置并检查它们是否设置为在相同的日期/时间/区域中运行。

    【讨论】:

      【解决方案6】:

      更改您的代码以使用 yyyymmdd 格式。 据我所知,它适用于所有数据库

      【讨论】:

        【解决方案7】:

        只是在这里添加另一个意见,我发现 dd/mmm/yyyy 是发送到数据库的最佳日期格式,因为它在不同文化中完全明确。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-07
          • 2022-09-30
          • 2011-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-19
          相关资源
          最近更新 更多