日期日期运算符之间的问题

时间:2019-04-22 12:35:24

标签: sql between

我正在针对“ https://www.w3schools.com/sql/sql_between.asp”中的日期来练习和试验SQL BETWEEN运算符的不同语法

这是我数据库中的Order表:

LINK:https://www.w3schools.com/sql/sql_between.asp

该查询正在获取2个日期的给定条件之间的订单日期。

这是两个主要的语法版本(根据w3schools):

SELECT *
FROM Orders
WHERE OrderDate BETWEEN #01/07/1996# AND #31/07/1996#;

和:

SELECT * 
FROM Orders
WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31';

我们在Orders表中键入上面两个查询所获得的输出

记录数:22(196条记录中)。是的,这是正确的。

现在我正在尝试4种不同的语法版本。

案例1:

SELECT * 
FROM Orders
WHERE OrderDate BETWEEN #1996/07/01# AND #1996/07/31#;

案例1的结果:22(与上述语法相同)

在SQL试用版编辑器(https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_between_date&ss=-1)中,他们指出WebSQL数据库不支持此SQL语句。该示例仍然有效,因为它使用SQL的修改版本。

案例2:

SELECT * 
FROM Orders
WHERE OrderDate BETWEEN #1996-07-01# AND #1996-07-31#;

结果是:22条记录(与案例1相同)

在SQL中尝试编辑器(https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_between_date&ss=-1

他们再次声明WebSQL数据库中不支持此SQL语句。该示例仍然有效,因为它使用了SQL的修改版本。

案例3

SELECT * 
FROM Orders
WHERE OrderDate BETWEEN '01/07/1996' AND '31/07/1996';

如果我在(https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_between_date&ss=-1)这个编辑器中编写此查询,则会收到错误消息

  

SQL错误:
  条件表达式中的数据类型不匹配。

但是,如果我在同一编辑器中的(https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_between_date2)中编写了相同的查询,则不会收到错误,但是也不会得到预期的结果(22条记录),但是我会得到全部196条记录。为什么会这样?

案例4:

SELECT * 
FROM Orders
WHERE OrderDate BETWEEN '01-07-1996' AND '31-07-1996';

如果我在(https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_between_date&ss=-1)这个编辑器中编写此查询,则会收到错误消息

  

SQL错误:
  条件表达式中的数据类型不匹配

但是,如果我在同一编辑器中的(https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_between_date2)中编写相同的查询,则不会收到错误,也不会得到想要的结果(22条记录),但是我又得到了全部196条记录。为什么会这样?这与案例3相同。

在情况3中,我写了

OrderDate BETWEEN '01/07/1996' AND '31/07/1996';

我得到了全部196条记录。但在此链接https://www.dofactory.com/sql/where-between

BETWEEN的语法与情况#3相似。

问题:获取2013年1月1日至2013年1月31日之间的订单数量和销售金额。

 SELECT COUNT(Id), SUM(TotalAmount)
 FROM [Order]
 WHERE OrderDate BETWEEN '1/1/2013' AND '1/31/2013'

问题1:与本段开头给出的2种主要语法版本相比,以上4种语法版本正确吗? (在所有四种情况下,我都交替使用连字符,斜杠,年份和日期)

问题2:在DoFactory中,它们使用情况#3语法(单引号内的DD/MM/YY)并获得问题所要求的期望输出。在w3学校编辑器中编写输出时,为什么没有得到想要的输出

问题3:在情况#3和情况#4中,存在“ SQL错误:条件表达式中的数据类型不匹配”。为什么会发生此错误?

问题4:“ WebSQL不支持此SQL语句”。为什么w3school tryit编辑器会输出此警告?

注意:我正在W3 Schools编辑器中编写所有查询。即使已下载,我也没有使用Oracle 11g。

1 个答案:

答案 0 :(得分:0)

如果您在Chrome中使用W3Schools Tryit编辑器,则您正在使用WebSQL,它基本上是SQLite

SQLite没有日期/时间格式,因此可能将日期值存储为以ISO-8601格式格式化的字符串(有关更多信息,请参见this answer)。

其他数据库系统(例如Oracle,Microsoft SQL Server,Postgres,MySQL)具有内置的日期格式,通常将它们表示为字符串(用单引号引起来)。例如:'1997-07-01'(取决于特定的RDBMS,可能会有更多特定的注意事项)。

使用井号(例如#7/1/1997#)的格式对于Microsoft Access是唯一的(有关更多信息,请参见this answer)。


底线:日期通常用单引号引起来。最好坚持使用ISO-8601标准(例如1997-07-01)。

如果您正在学习SQL,除了W3Schools之外,还有其他资源。我建议下载像Postgres或MySQL这样的开源RDBMS,建立示例数据库,并处理一些查询。像codewars这样的挑战性网站也可能会有所帮助


还有一件事:不要使用BETWEEN作为日期。使用>=<,以确保您不排除带有时间部分的日期。有关更多信息,请阅读this blog