【问题标题】:SQL - Select records for the same day between particular data range [closed]SQL - 在特定数据范围之间选择同一天的记录[关闭]
【发布时间】:2013-10-18 07:31:04
【问题描述】:

我需要检查一些值之间的 SQL 日期范围。 例子。检查过去 2 到 1 小时之间添加的记录。

以下查询是否正确:

SELECT * 
FROM tablename 
WHERE dtdatetime BETWEEN DATEADD(hh, -1, GETDATE()) AND DATEADD(hh, -2, GETDATE())

请您提供建议。

【问题讨论】:

  • 与其询问是否正确,不如尝试一下。结果是你所期望的吗?如果是这样,那么你做对了。如果不是,请回来发布您正在做的事情、您的期望以及您得到的结果。

标签: sql sql-server datetime getdate


【解决方案1】:
  • 不要使用像hh 这样的懒惰速记。 Here's why
  • 不要使用BETWEENHere's why。无论如何,它要求第一个参数是较小的参数 - 你的问题实际上是你说的是WHERE 2 BETWEEN 3 AND 1,只有当你把它翻转到WHERE 2 BETWEEN 1 AND 3时它才会返回true。继续尝试 - 较小的论点需要放在第一位。但实际上,无论如何都不要使用BETWEEN 进行日期范围查询。

您的查询应如下所示:

WHERE dtdatetime >= DATEADD(HOUR, -2, GETDATE())
  AND dtdatetime <  DATEADD(HOUR, -1, GETDATE());

请注意,根据您在当前小时内运行的时间,这将给出不同的结果。例如,如果您在 12:32 运行它,它将给出数据 >= 10:32 和 = 10:00 和

DECLARE @TopOfHour DATETIME;
SET @TopOfHour = DATEADD(HOUR, DATEPART(HOUR, GETDATE()), DATEDIFF(DAY, 0, GETDATE()));

SELECT ...
WHERE dtdatetime >= DATEADD(HOUR, -2, @TopOfHour)
  AND dtdatetime <  DATEADD(HOUR, -1, @TopOfHour);

【讨论】:

  • 我收到了这个错误#1305 - FUNCTION &lt;db_name&gt;.DATEADD does not exist
  • @AminahNuraini 好吧,您从哪里得知您在 DATEADD() 前面加上了数据库名称?你在使用 MySQL 吗?这个问题是关于 SQL Server 的。
  • 啊,是的,我正在使用 MySQL。对不起
  • 对 BETWEEN 声明的厌恶是主观的。你很好地说明了它可能会如何误导,但对你的操作员粗心也是如此。 BETWEEN 是在那个方向上从 A 到 B 的范围。声明您要从 3 个月前的起点 (A) 到今天的终点提取记录,在使用此语句时似乎非常简单。不按评估顺序排列对我来说是一个更大的问题。
  • @Bonez024 你读过the link I shared吗?另见this post。与将参数按错误顺序放置等粗心有关的情况要少得多,而要准确定义范围“结束”的构成要素,尤其是对表,参数,变量等的任何数据类型更改的影响。-这可能超出您的控制甚至知识范围 - 会影响您查询的准确性。
猜你喜欢
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多