我有一个start_date和end_date。我想要得到这两个日期之间的日期列表。有人能帮我指出我的查询中的错误吗?

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and Date between 2011/02/25 and 2011/02/27

这里Date是一个datetime变量。


当前回答

对当前日期和前三天之间的选择日期的最佳查询:

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN       
DATE_SUB(CURDATE(), INTERVAL 3 DAY)  AND CURDATE() 

当前日期和未来三天之间的选择日期的最佳查询:

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN   
   CURDATE()  AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)   

其他回答

这对我很有效

SELECT 
  * 
FROM 
  `request_logs` 
WHERE 
  created_at >= "2022-11-30 00:00:00" 
  AND created_at <= "2022-11-30 20:04:50" 
ORDER BY 
  `request_logs`.`id` DESC

这是非常古老的,但考虑到我有很多关于日期的经验,你可能会考虑这个:人们使用不同的区域设置,因此,一些人(以及一些数据库/计算机,取决于区域设置)可能会将11/12/2016这个日期读为11/dec 2016或11/12,2016。此外,提供给MySQL数据库的16/11/12将在内部转换为2016年11月12日,而运行在英国区域设置计算机上的Access数据库将解释并存储为2012年11月16日。

因此,每当我要与日期和数据库交互时,我都明确地制定了自己的策略。所以我总是提供我的查询和编程代码如下:

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';

还要注意Access将接受#,因此:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;

但是MS SQL服务器不会,所以我总是使用“'”如上所述,这两个数据库都接受。

当从代码中的变量中获得日期时,我总是将结果转换为字符串,如下所示:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")

我写这篇文章是因为我知道有时一些程序员可能不够敏锐,无法检测到内在的转换。对于< 13的日期将不会出现错误,只是结果不同!

对于所问的问题,在最后一天的基础上加一天,做如下比较:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 

我会选择

select Date,TotalAllowance from Calculation where EmployeeId=1
             and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')

逻辑是>=包括整个开始日期,<不包括结束日期,因此我们在结束日期上添加一个单位。这可以适应几个月,例如:

select Date, ... from ...
             where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)

你应该把这两个日期放在单引号之间,比如..

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'

或者可以使用

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'

请记住,第一次约会包含所有内容,但第二次约会就不包含所有内容,因为它实际上是“2011/02/27 00:00:00”。

例子:工作和非工作。

select * from tblUser Where    
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**

OR

select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**

OR

select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working**

下面的AND是无效的:

select * from tblUser Where
Convert(Varchar(10),CreatedDate,111) >=  Convert(Varchar(10),'01-01-2015',111) and  Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working**


select * from tblUser Where
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working**