【问题标题】:SQL Server: How to do WHERE statement to show only December 2015..?SQL Server:如何执行 WHERE 语句以仅显示 2015 年 12 月 ..?
【发布时间】:2016-03-01 01:38:20
【问题描述】:

我是 SQL 新手,正在学习基础知识。我进行了搜索,但没有找到我需要的确切答案。

我有一张表格,其中显示了已购买产品的客户以及他们购买的datetime。该列称为SaleDatedatetime 的格式(例如)如下所示:

2015-08-21 00:00:00.000
2014-03-17 00:00:00.000

我需要使用查询来仅显示 2015 年 12 月期间购买的产品。我认为 SELECTFROM 语句与我的问题无关。这是我尝试过的两个WHERE 子句。这些都不起作用。

WHERE  SaleDate = '2015-12%'
WHERE  SaleDate = '%Dec-2015%'

【问题讨论】:

  • 下面有一个有用的答案,尤其是。对于 DateTime 列,但请注意,如果您尝试使用 '%' 符号匹配 字符串,则可能需要使用 WHERE Column LIKE ...
  • 虽然之前有人问过批准的答案,但没有一个好的答案。它将表列包装在一个函数中,该函数使列上的任何索引都无用,并且总是强制扫描而不是搜索。
  • 此处接受的答案是重复问题中建议答案的副本。我认为我们不应该仅仅因为接受的答案不是最好的就注销重复的。在所有建议的答案中,我最喜欢 DATEDIFF() 答案。我仍然说这是一个骗局。

标签: sql-server


【解决方案1】:

你可以使用BETWEEN:

WHERE SaleDate BETWEEN '2015-12-01 00:00:00' AND '2016-01-01 00:00:00'

【讨论】:

  • BETWEEN 包含在内。这意味着在2016-01-01 00:00:00 上发生的任何销售都将包含在结果集中。如果实际设置了时间部分,这不太可能成为问题,但很多时候DATETIME 字段只是设置为默认00:00:00 的日期,WHERE SaleDate >= 2015-12-01 00:00:00 AND SaleDate < 2016-01-01 00:00:00 可能是更好的选择。
  • 感谢 Adam V。在我将 ' 添加到日期时间的两侧后,它起作用了。
  • @Kidiskidvogingogin - 如果您认为您可能会在新年前夜的午夜收到订单,您也可以将结尾更改为“2015-12-31 23:59:59.997”,但那是不太明显,并且依赖于 SQL 的时间戳舍入功能。
  • 需要在您的日期文字周围添加 ''。
  • 肖恩,没错。我是 SQL 新手,但我确实掌握了那部分 :)
【解决方案2】:

使用 YEAR 和 MONTH 函数

... 年份(SaleDate)= 2015 和 MONTH(SaleDate)= 12

不要使用 BETWEEN,因为您必须将日期表示为文字,考虑到您的 SaleDate 列可能会在未来包含时间部分,这将是一个问题...

【讨论】:

  • 之前有人发布了同样的方法,但由于某种原因删除了答案。这是我真正去的那个。你提出了一个很好的观点。对于我的具体情况,这无关紧要,但在现实世界的情况下,你是对的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多