【问题标题】:WHy doesn't my stored procedure work for same dates?为什么我的存储过程不适用于相同的日期?
【发布时间】:2016-01-16 13:13:06
【问题描述】:

虽然我有这些日期的记录,但为什么当我传递相同的日期(即从和到日期相同)时我的存储过程不起作用。为什么 ?

 SELECT
     Audits.pk_Audits_AuditID, 
     Audits.fk_WebUsers_Audits_UserID, 
     Web_Users.Name as UserName, 
     Districts.pk_Districts_DistrictID,
     Districts.DistrictName, 
     Orgs.pk_Orgs_OrgID, Orgs.OrgName, 
     Audits.AuditsUserActivity, 
     Audits.AuditsUserIPAddress,
     Audits.AuditsUserSystemMacAddress, 
     CONVERT(varchar, Audits.AuditSystemEntryDateTime, 113) AS AuditSystemEntryDateTime
FROM 
    Audits
INNER JOIN
    Web_Users ON Web_Users.UserID= Audits.fk_WebUsers_Audits_UserID
INNER JOIN
    Orgs ON Orgs.pk_Orgs_OrgID= Web_Users.fk_Orgs_OrgID_WebUsers
INNER JOIN
    Districts ON Districts.pk_Districts_DistrictID= Orgs.fk_Districts_Orgs_DistrictID
WHERE
    CONVERT(varchar, DateAdd(DAY, -1, Audits.AuditSystemEntryDateTime)) >= @FromDate
    AND CONVERT(varchar, Audits.AuditSystemEntryDateTime) <= @ToDate

【问题讨论】:

  • 当你想比较日期时删除CONVERT(varchar..
  • 请提供@FromDate@ToDate 值的示例
  • Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何 varchar 变量和参数提供长度
  • 嗯,你在比较 AuditSystemEntryDateTime - 1 天大于或等于它应该小于等于的同一天......那应该如何匹配?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

它不起作用,因为您的AuditSystemEntryDateTime 大概有时间。我怀疑你想要的逻辑是:

 Where CONVERT(date, DateAdd(DAY, -1, Audits.AuditSystemEntryDateTime)) >= @FromDate and
       CONVERT(date, Audits.AuditSystemEntryDateTime) <= @ToDate

一般来说,您不希望将datetime 转换为字符以用于输出以外的任何目的。

但是,编写此逻辑的更好方法是:

where Audits.AuditSystemEntryDateTime >= dateadd(day, 1, @FromDate) and
      Audits.AuditSystemEntryDateTime < dateadd(day, 1, @ToDate)

通过将所有函数保留在常量上,SQL Server 可以为where 子句使用索引。嗯,增加一天也可以解释为什么你没有结果。也许您只是想要:

where Audits.AuditSystemEntryDateTime >= @FromDate and
      Audits.AuditSystemEntryDateTime < dateadd(day, 1, @ToDate)

这确实是最有意义的。

【讨论】:

  • 最后一个代码示例应该可以完美运行,例如@fromDate = @toDate = 2016-02-02
  • 该死的有人否决了 SQL 大师。赞成取消它。答案完全有效
  • @VR46 。 . .我偶尔会犯错,应该投反对票(好吧,我自己不投反对票,所以我更喜欢 cmets)。但是,这个答案似乎是正确的。
  • @StackyFlowy 不工作没什么好继续的。提供样本数据。投票结束。如果您提供示例数据来重现问题,我将撤回我的投票结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多