选择带有日期条件的查询

Posted

技术标签:

【中文标题】选择带有日期条件的查询【英文标题】:Select query with date condition 【发布时间】:2010-11-15 09:53:03 【问题描述】:

我想检索d/mm/yyyy之后、d/mm/yyyy之后和d/mm/yyyy之前的某些日期的记录,我该怎么做?

SELECT date
FROM table
WHERE date > 1/09/2008;

SELECT date
FROM table
WHERE date > 1/09/2008;
AND date < 1/09/2010

它不起作用。

【问题讨论】:

【参考方案1】:

请注意,您会在不知不觉中询问“日期大于 1 除以 9,除以 2008 的位置”。

在日期周围加上# 符号,就像这样#1/09/2008#

【讨论】:

很高兴看到人们再次将 -1 放在正确答案上,并且没有添加评论来解释原因 -1。这种方式依赖于默认日期格式 dd/mm/yyyy。另一个答案使用 ISO 日期格式。 OP 确实问过“我该怎么做”,而不仅仅是“为什么我的 sql 返回错误的答案”【参考方案2】:

分号字符用于终止 SQL 语句。

您可以在日期值周围使用# 符号,也可以使用Access 的(ACE、Jet 等)强制转换为DATETIME 函数CDATE()。顾名思义,DATETIME 总是包含一个时间元素,因此您的文字值应该反映这一事实。 SQL 引擎完全理解 ISO 日期格式。

最好不要在 Access 中将 BETWEEN 用于 DATETIME:它是使用浮点类型建模的,无论如何时间是一个连续体;)

DATETABLE 是 SQL 标准、ODBC 和 Jet 4.0(可能更高版本)中的保留字,因此最好避免使用数据元素名称:

您的谓词建议对时期进行开放式表示(其开始日期或结束日期都不包含在时期中),这可以说是最不受欢迎的选择。这让我想知道您是否打算使用封闭式开放表示(既不包括其开始日期,但期间在结束日期之前结束):

SELECT my_date
  FROM MyTable
 WHERE my_date >= #2008-09-01 00:00:00#
       AND my_date < #2010-09-01 00:00:00#;

或者:

SELECT my_date
  FROM MyTable
 WHERE my_date >= CDate('2008-09-01 00:00:00')
       AND my_date < CDate('2010-09-01 00:00:00'); 

【讨论】:

我不明白你为什么不推荐 BETWEEN 日期。是的,您必须认识到,如果您不考虑时间组件,您的结果可能不会像预期的那样,但这不是 BETWEEN 的缺陷,而是由于不了解数据存储而导致的简单试点错误。 @David-W-Fenton:存储的浮点特性(该飞行员完全意识到这一点)意味着将 BETWEEN 与 Access(ACE、Jet 等)一起使用的唯一方法是始终将值四舍五入到您想要的准确度水平(一天,一秒等,但亚秒级的准确度很棘手......)但是用户在他们的查询中使用NOW(),所以您必须从基础撤销权限表并使用带有DATETIME参数的存储过程公开所需的功能,您可以四舍五入......这一切都变得太费力了。 @David-W-Fenton:“是的,你必须认识到你的结果可能不符合预期”——我支持的所有应用程序都要求所有结果都符合预期。不是你的……? 怎么可能有人对因无知而产生的期望负责?问题不在于 BETWEEN,而是人们经常不了解日期是如何存储的。因此,他们会犯错误。这不是 BETWEEN 的缺陷,而是由于无知造成的一个明显的老错误。建议人们避免 BETWEEN 是因为由于无知而产生的潜在错误,这意味着您认为纠正他们缺乏理解对他们来说并不是更好的选择。 @David-W-Fenton:无知是设计的:我们称之为“特权”。非管理员用户将不知道某些基表;相反,他们将不得不使用 'helper VIEW s 和 PROCEDURE s。时间数据库是不直观的,例如有效状态模型中的顺序更新需要五个 SQL-92 语句(两个 INSERT 和三个 UPDATE )——我必须查一下!如果我不记得它,我就不能指望用户。封装这种复杂性是一件好事,IMO。如果你愿意,无知是幸福的。【参考方案3】:
select Qty, vajan, Rate,Amt,nhamali,ncommission,ntolai from SalesDtl,SalesMSt where SalesDtl.PurEntryNo=1 and SalesMST.SaleDate=  (22/03/2014) and SalesMST.SaleNo= SalesDtl.SaleNo;

应该可以的。

【讨论】:

hmmm ...编辑将代码下方的注释从“不工作”更改为“工作” - 恰恰相反,不是吗?那么现在,您的意图是什么,回答(如现在)或问题(如编辑前)?【参考方案4】:

嘿伙计们,我认为您正在寻找的是使用 select 命令的这个。 有了这个,你可以在 mysql 中指定一个 RANGE GREATER THAN(>) OR LESSER THAN(

select* from <**TABLE NAME**> where year(**COLUMN NAME**) > **DATE** OR YEAR(COLUMN NAME )< **DATE**;

例如:

select name, BIRTH from pet1 where year(birth)> 1996 OR YEAR(BIRTH)< 1989;
+----------+------------+
| name     | BIRTH      |
+----------+------------+
| bowser   | 1979-09-11 |
| chirpy   | 1998-09-11 |
| whistler | 1999-09-09 |
+----------+------------+

对于简单的范围,例如仅使用大于/小于

mysql> select COLUMN NAME from TABLE NAME> where year(COLUMN NAME)> 1996;

例如 mysql>

select name from pet1 where year(birth)> 1996 OR YEAR(BIRTH)< 1989;
+----------+
| name     |
+----------+
| bowser   |
| chirpy   |
| whistler |
+----------+
3 rows in set (0.00 sec)

【讨论】:

以上是关于选择带有日期条件的查询的主要内容,如果未能解决你的问题,请参考以下文章

带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询

房间 - 选择带有 IN 条件的查询?

查询以选择某些条件为真的两个日期之间的列的总和

如何在firebase中查询日期为datenow的选择条件?

带有禁用日期的 ReactJS 日期范围选择器 - Rsuite

选择具有最长日期和其他条件的行