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"

顺便说一下,R​​eservationDate 字段是字符串格式的。即使在 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 请求

SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1

SQL查询以选择两个日期之间的日期

选择日期之间的房间可用性(sql查询)

SQL 选择除最近日期之外的所有内容

选择日期最小的所有行[关闭]