SQL 查询不会选择日期之间的所有行
Posted
技术标签:
【中文标题】SQL 查询不会选择日期之间的所有行【英文标题】:SQL query doesn't select all rows between dates 【发布时间】:2015-04-24 08:27:50 【问题描述】:我的 SQL 查询没有选择我要求的所有行。它只考虑日期时间的 Day 部分;月没有得到任何关注。
这是我的查询:
SELECT *
FROM Reservations
WHERE ReservationDate >= '24/04/2015' AND ReservationDate <= '24/03/2015'"
这些日期没有结果,但是当日期更改为:
SELECT *
FROM Reservations
WHERE ReservationDate >= '24/04/2015' AND ReservationDate <= '17/03/2015'"
我得到 2 个结果 when ReservationDate= "17/04/2015 15:02:03" and "21/04/2015 16:05:56"
。
顺便说一下,ReservationDate 字段是字符串格式的。即使在 DateTime 上,结果也是一样的。
ReservationID FriendID TableNumber ReservationDate ReservationStatus
16 58767732 32 21/04/2015 17:06:54 False
17 -1 32 21/04/2015 17:10:41 False
18 -1 2 21/04/2015 17:17:23 False
2 58767732 3 04/04/2015 19:37:17 False
3 -1 7 04/04/2015 19:37:43 False
4 -1 5 04/04/2015 23:24:24 False
5 -1 31 05/04/2015 16:29:02 False
6 -1 6 05/04/2015 16:40:29 False 7 -1 6 05/04/2015 17:12:47 False
8 58767732 32 09/04/2015 16:24:00 False
9 -1 6 09/04/2015 16:25:03 False
【问题讨论】:
你能包含来自Reservations
的样本数据吗?
ReservationID |好友ID |预订日期
@Netanelgo 请将AND
更改为OR
。您不能有日期在两个不相交的数据范围之间的预订。
@ConsiderMe,而是切换 >= 和
第一个也是最重要的问题是,这些真的是日期还是字符串?您使用的是哪个 DBMS?
【参考方案1】:
尝试对日期使用 between 运算符
select * from Reservations
where
ReservationDate between '17/03/2015'
and
DATE_ADD('24/04/2015',INTERVAL 1 DAY) // or something like that
另外,在 mysql 中,您可以使用 DATE 函数从日期时间中提取日期:
select * from Reservations
where
DATE(ReservationDate) BETWEEN '17/03/2015' AND '24/03/2015'
如果您使用的是 MS Sql Server,有some other 变通方法可以从字符串中获取日期。
更新:
因为@Netanelgo 说他正在使用 MS Access:
尝试CDate()
将您的字符串转换为日期。
select * from Reservations
where CDate(date) between #17/03/2015# and #24/03/2015#;
如果由于 CDate 无法重新调整您的格式而无法正常工作,您可以使用 DateSerial(year,month,day) 来构建日期。您将需要使用 mid$ 和 Cint() 来构建年、月和日参数。像这样的格式“yyyy-mm-dd”:
DateSerial(CInt(mid(date, 1, 4)), CInt(mid(date, 6, 2)), CInt(mid(date, 9, 2))
【讨论】:
@Netanelgo 你用的是什么数据库? Sql Server 女士,Oracle,MySql? @Netanelgo 你试过了吗:***.com/questions/24622282/… 有效!只是一个更小的问题,当它到达日期为 12/03/2015 时,它选择格式为 mm/dd/yyyy 的日期(当 main 为 dd/mm/yyyy 时)。我该怎么办? @Netanelgo 我认为这可能是您的比赛设置、区域设置等。 我的 comp 使用 dd/mm/yyyy。没有任何编程方式吗?【参考方案2】:在你的第一句话改变比较如下
SELECT *
FROM Reservations
WHERE ReservationDate <= '24/04/2015' AND ReservationDate >= '24/03/2015'"
【讨论】:
'24/04/2015'
是字符串,而不是日期。
您的意思是日期和文字没有区别?那么数据类型转换的目的是什么?如果您将字符串与日期进行比较,那么优化器将进行隐式数据类型转换,您应该避免这种情况。在与日期进行比较时,始终将文字显式转换为日期。
我不是这么说,问这个问题的人已经尝试过使用日期格式,这不是错。当然应该是datetime,不用讨论类型应该是datetime
好的,伙计。如果您知道我想告诉您的内容,那么我们都很高兴:-)【参考方案3】:
我尝试重新创建它,但在查询这些日期时没有收到任何数据行。这可能是因为(正如阿巴塞尔马斯指出的那样)你的 似乎有点困惑。
问题似乎是您将日期存储为字符串。正如 The Bojan 提到的,您可以在 MySQL 中使用 DATE() 运算符解决这个问题。在 T-SQL 中,可以使用 cast,如下:
set dateformat dmy
create table #reservations (ReservationID int, FriendID int, TableNumber int, ReservationDate varchar(30), ReservationStatus bit)
INSERT INTO #Reservations values (16, 58767732, 32, '21/04/2015 17:06:54', 'FALSE'),
(17, -1, 32, '21/04/2015 17:10:41', 'FALSE'),
(18, -1, 2, '21/04/2015 17:17:23', 'FALSE'),
(2, 58767732, 3, '04/04/2015 19:37:17', 'FALSE'),
(3, -1, 7, '04/04/2015 19:37:43', 'FALSE'),
(4, -1, 5, '04/04/2015 23:24:24', 'FALSE'),
(5, -1, 31, '05/04/2015 16:29:02', 'FALSE'),
(6, -1, 6, '05/04/2015 16:40:29', 'FALSE'),
(8, 58767732, 32, '09/04/2015 16:24:00', 'FALSE'),
(9, -1, 6, '09/04/2015 16:25:03', 'FALSE'),
(7, -1, 6, '05/04/2015 17:12:47', 'FALSE')
SELECT *
FROM #Reservations
WHERE cast(left(ReservationDate,10) as date) <= '24/04/2015' AND cast(left(ReservationDate,10) as date) >= '17/03/2015'
drop table #reservations
当我更改日期时,它只返回了我期望看到的预订。
【讨论】:
【参考方案4】:应该这样做:
Select * From Reservations
Where
DateSerial(Mid(ReservationDate, 7, 4), Mid(ReservationDate, 4, 2), Mid(ReservationDate, 1, 2))
Between #17/03/2015# and #24/03/2015#;
【讨论】:
以上是关于SQL 查询不会选择日期之间的所有行的主要内容,如果未能解决你的问题,请参考以下文章
如果日期列介于开始日期和结束日期之间,则选择行 FMDB 请求