【问题标题】:sql server datetimesql server 日期时间
【发布时间】:2010-05-03 09:30:53
【问题描述】:

我有以下疑问:

select * from table where table.DateUpdated >='2010-05-03 08:31:13:000'

正在查询的表中的所有行都有以下 DateUpdated:

2010-05-03 08:04:50.000

它返回表中的所有行——即使它不应该返回任何行。

我很确定这是因为一些糟糕的日期/时间区域性问题。

如果我把日期换成

select * from table where table.DateUpdated >='2010-03-05 08:31:13:000'

然后它应该做的。

如何强制所有内容都使用相同的设置?这让我很头疼:)

如果重要的话,这是 NHIbernate 从我的 WCF 服务生成的 sql。

w://

【问题讨论】:

  • 您能告诉我们您使用哪种技术让 NH 查询数据库
  • 您使用的是 CreateQuery()、CreateCriteria()、CreateSqlQuery()、NHibernate.Linq 还是其他方法?
  • 我想知道您是如何传递日期的。您是否尝试将 Thread.CurrentThread.CurrentCulture 设置为您所追求的文化。您的应用程序和 sql server 可以在具有不同默认文化的机器上吗?
  • @ondesertverge:SQL Server 内部设置独立于操作系统

标签: sql-server wcf nhibernate datetime


【解决方案1】:

使用这种格式“yyyymmdd hh:nn:ss.mmmm”,它在 SQL Server 中与区域设置无关,所有版本

现在是 2 月 5 日而不是 5 月 3 日

为什么:

  • “yyyy-mm-dd”在具有日期时间列的 SQL Server 中独立于区域设置
  • 此异常已在 SQL Server 2008 中使用 datetime2 修复

参考资料:

例子:

SET DATEFORMAT DMY  --UK
SELECT
    MONTH(CAST('2010-03-05 08:31:13:000' AS datetime)), --gives 5
    MONTH(CAST('20100305 08:31:13:000' AS datetime)) --gives 3


SET DATEFORMAT MDY  --default, USA
SELECT
    MONTH(CAST('2010-03-05 08:31:13:000' AS datetime)), --gives 3
    MONTH(CAST('20100305 08:31:13:000' AS datetime)) --gives 3

【讨论】:

  • hmph - 这确实回答了问题的 sql 部分,但我不知道如何在 nhobernate 中使用它:(
  • 是否有区域设置或区域设置,或者您可以自己格式化日期吗?
  • 似乎有 datetime2 类型添加到 nhibernate 以配合 MsSqlServer2008 方言 - 打算试试这个......
【解决方案2】:

你可以试试:

select * from table 
where Convert(DateTime, table.DateUpdated,103) >= Convert(DateTime, '2010-05-03 08:31:13:000',103)

【讨论】:

  • 嘿 - 干杯 - 我现在正在看 - 问题是这是来自 nhibernate。我不明白为什么它不能像 sriaght sql 一样工作。
  • 另外 - 因为这是从应用程序上次更新时获得的增量 - 它需要使用时间和日期来完成......
【解决方案3】:

这个问题的答案是升级到 2008 并使用 datetime2

什么皮塔饼!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2011-05-15
    • 2014-08-23
    • 2017-06-27
    • 2013-08-11
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多