日期在不同的dbs上表现不同?

时间:2011-02-21 16:01:06

标签: asp.net sql-server collation

我有一个asp.net网页,上面有一个jQuery datepicker。

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

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

jQuery似乎每次都会生成正确的日期 - 这让我觉得它可能是一个数据库问题。

我使用的是SQL Server 2005,我的排序规则为Latin1_General_CI_AS,我的同事正在使用整理SQL_Latin1_General_CP1_CI_AS和中文排字。

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

提前致谢!   - L

[编辑添加代码信息]

这是我调用datepicker的视图代码:

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

这是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; }

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

谢谢:)

7 个答案:

答案 0 :(得分:2)

我希望等到你用更多信息更新问题,但是我已经看到一些答案表明你改变了用来与数据库交谈的 string 格式。 ..

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

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

除了其他任何东西,如果你直接在SQL查询中包含用户数据,你通常会打开自己的SQL注入攻击。 始终使用参数化查询(除非您的网络应用真的“运行此SQL”测试工具...)

如果您已经在使用参数化查询,那么问题可能出在浏览器和ASP.NET之间,而数据库部分则无关紧要。划分和解决问题:在数据通过不同的层(浏览器,jQuery,ASP.NET等)时追逐数据,直到找到出错的地方。在你知道哪里出错之前,不要考虑修复。

答案 1 :(得分:1)

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

“文化”值确定与文化相关的功能的结果,例如日期,数字和货币格式等。 UICulture值确定为页面加载哪些资源

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

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

答案 2 :(得分:0)

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

CAST and CONVERT

答案 3 :(得分:0)

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

enter image description here

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

答案 4 :(得分:0)

您还需要检查ASP.Net图层,看看它的运行情况。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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