选择带有日期条件的查询
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
:它是使用浮点类型建模的,无论如何时间是一个连续体;)
DATE
和 TABLE
是 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 更新查询作为带有一些空值的选择查询
如何在firebase中查询日期为datenow的选择条件?