我正在针对“ 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。
答案 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。