【问题标题】:Date comparison doesn't take year into account日期比较不考虑年份
【发布时间】:2014-06-30 20:33:55
【问题描述】:

我正在尝试通过比较日期值来检索记录,如下所示:

declare @fromdate as date
declare @todate as date
set @fromdate='2013-04-01'
set @todate='2013-04-13'
select createdon,
convert(varchar,PhoneCall.createdon,101) as createdon,
convert(varchar,@fromdate,101) as fromdate
from
PhoneCall
where convert(varchar,PhoneCall.createdon,101)  >= convert(varchar,@fromdate,101) and  convert(varchar,PhoneCall.createdon,101)  <= convert(varchar,@todate,101)

比较有问题,我尝试使用各种转换格式,但没有收到正确的结果。

上面的查询是我最近试用的,虽然看起来是对的,并没有考虑到年份的对比。所以显示的结果如下:

      Createdon            ConvertedCreatedOn      ConvertedFromDate  
2013-05-08 14:13:16.000      05/08/2013              05/01/2013
2014-05-01 17:10:03.000      05/01/2014              05/01/2013

编辑: 这是我将用于报告的查询。 @fromdate 和 @todate 是用户手动输入的报告参数,因此我必须确保它们的格式与数据库日期格式相同。

【问题讨论】:

  • 你需要使用过滤后的视图而不是表格,所以使用FilteredPhoneCall而不是PhoneCall
  • 感谢您指出这一点。我阅读了更多关于 Views 的内容,我意识到我应该使用它们,这是一个很好的链接:blogs.msdn.com/b/crm/archive/2006/05/01/587823.aspx

标签: sql-server date format comparison dynamics-crm-2011


【解决方案1】:

为什么要将所有 DATE 字段/参数转换为 VARCHAR?只需使用 DATE 比较:

where PhoneCall.createdon BETWEEN @fromdate AND @todate

如果您需要使用 varchar,那么您应该使用 102 format (yyyy.mm.dd) 而不是 101 (mm/dd/yyyy)。在这种情况下,它可用于将日期作为字符串进行比较。

【讨论】:

  • 非常感谢,这为我节省了数小时的试用时间。但是“101”不起作用有什么原因吗?我的意思是不是双方都具有相同的格式,那么比较应该可以解决吗?我不确定是否应该为此创建另一个问题
  • @user3340627:将日期转换为 VARCHAR 后,您将获得两个 STRINGS 并将它们与 STRING 比较规则进行比较。它从第一个字母开始,到第一个差异来决定哪个必须是第一个。如果您使用 101 格式 (DD.MM.YYYY),那么 DAY 是第一个元素,因此 02.MM.YYYY 总是 &gt;= 01.MM.YYYY 对于任何月份和年份。
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2019-12-06
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多