【问题标题】:SQL query select between two dates errorSQL查询在两个日期之间选择错误
【发布时间】:2013-02-11 06:25:11
【问题描述】:

我需要您的帮助,因为我正在努力处理 SQL 中的查询。这个查询没有给出我想要的确切结果。我需要提取两个日期之间的所有日期。

我尝试了两个查询:

SELECT a.MemberID,CONVERT(varchar(12), b.BirthDate, 101) AS BirthDate
FROM Members_Hired AS a
    INNER JOIN Members AS b
        ON a.ReferenceID = b.RecordID
WHERE (CONVERT(varchar(12), b.BirthDate, 101) >= '02/01/2013'
    and CONVERT(varchar(12), b.BirthDate, 101) <= '02/27/2013')

SELECT a.MemberID,CONVERT(varchar(12), b.BirthDate, 101) AS BirthDate
FROM Members_Hired AS a
    INNER JOIN Members AS b
        ON a.ReferenceID = b.RecordID
WHERE (CONVERT(varchar(12), b.BirthDate, 101) BETWEEN '02/01/2013' and '02/27/2013')

这也会给出日期为'02/05/1990''02/17/1990' 的结果。它只考虑月份和日期,而不是确切的年份。

【问题讨论】:

  • 不会是 1990 年吗?
  • 如果你在比较日期,你必须把它倒过来,所以先是 yyyy,然后是 mm,然后是 dd。如果birthdate 是一个日期字段,您可以使用 to_char(b.birthdate,'yyyy-mm-dd') 将其转换 - 这将是 Oracle 语法,但这就是为什么我将其作为评论而不是答案发布的原因
  • b.BirthDate 是什么类型?是日期、日期时间还是其他?
  • 虽然给出的答案是关于使用日期/时间类型进行比较的正确答案,但它们都遗漏了一件事 - they shouldn't be using BETWEEN (especially on SQL Server)。其他任何事情都是错误的时间思考方式......

标签: sql sql-server sql-server-2008


【解决方案1】:

您应该比较日期而不是 varchar 值。如下更改您的 where 子句。另请注意,我在转换之前使用 ISO 格式 (yyyymmdd) 字符串日期,以确保它适用于任何文化。

b.birthdate between convert(date,'20130201' ) and 
                  convert(date, '20130227')

【讨论】:

  • 如果我可以使用非特定文化的日期格式,我会再投赞成票。
【解决方案2】:

我认为您是在比较字符串而不是日期时间,因此结果有记录“02/25”和“02/17”。

【讨论】:

  • 从“where”子句中删除所有“CONVERT”。
【解决方案3】:

假设您的生日字段是 DateTime 类型,您需要将输入转换为相同的类型。

你试过了吗?

WHERE (b.BirthDate BETWEEN Cast('02/01/2013' As DateTime) and Cast('02/27/2013' As DateTime))

【讨论】:

  • 危险。如果我在英国怎么办?现在它正在寻找 1 月 2 日而不是 2 月 1 日。
  • OP 日期所在的日期。 Cast 是各自的文化,我不正确吗?如果 OP 在英国,日期参数会有所不同而不是声明(01/02/2013 和 27/02/2013)?只是问
  • 我的观点是鼓励区域格式(即使 OP 引入了它们)是一个坏主意。原因?您的答案的下一位读者可能没有与 OP 相同的要求,并且可能正在寻找 2/1 -> 2/8,因此您的答案中的“明显”格式可能会被完全忽略。请阅读sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/…sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/…
猜你喜欢
  • 2015-04-01
  • 2011-07-04
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多