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

时间:2011-02-26 04:29:17

标签: sql sql-server tsql datetime sql-server-2005

我有start_dateend_date。我想获得这两个日期之间的日期列表。任何人都可以帮我指出我的查询中的错误。

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

此处Datedatetime变量。

23 个答案:

答案 0 :(得分:412)

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

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'

答案 1 :(得分:108)

由于没有指定时间段的日期时间的值为date 00:00:00.000,如果您想确保获得范围内的所有日期,则必须提供结束日期的时间或增加结束日期并使用<

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

OR

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

OR

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

请勿使用以下内容,因为如果时间为00:00:00.000,它可能会从2011/02/28返回一些记录。

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

答案 2 :(得分:13)

试试这个:

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

日期值需要输入为字符串。

为了确保您的SQL Server 2008及更高版本的查询面向未来,Date应该被转义,因为它是更高版本中的保留字。

请记住,没有时间的日期会将午夜作为默认值,因此您可能没有正确的值。

答案 3 :(得分:9)

select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

此处,首先在当前endDate中添加一天,它将为2011-02-28 00:00:00,然后减去一秒钟以生成结束日期2011-02-27 23:59:59。通过这样做,您可以获得给定间隔之间的所有日期。

output:
2011/02/25
2011/02/26
2011/02/27

答案 4 :(得分:5)

此查询适用于获取当前日期与其后3个日期之间的值

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)

这最终会在当前日期增加3天的缓冲区。

答案 5 :(得分:5)

select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

- 如果数据类型不同

答案 6 :(得分:4)

这是非常古老的,但考虑到我在日期方面的大量经验,您可能需要考虑这一点:人们使用不同的区域设置,例如某些人(以及一些数据库/计算机,具体取决于区域设置) 2016年12月11日或2016年11月12日可能会读取此日期2016年12月12日。更多,提供给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")

我写这篇文章是因为我知道有些程序员可能不够敏锐,无法检测到固有的转换。日期&lt; 13,结果不同!

关于提出的问题,请在最后一天添加一天,并进行如下比较:

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

答案 7 :(得分:3)

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'

答案 8 :(得分:3)

尝试将日期置于##之间 例如:

#2013/4/4# and #2013/4/20#

它对我有用。

---编辑--- 我收到一条通知,说我失去了两个声望点,因为有人低估了这个答案。如果答案对你不起作用,请不要只是投票。在评论中询问进一步的信息/帮助,或检查其他解决方案。

我不关心声望点 - 我只是说没有为此做出选票。

答案 9 :(得分:2)

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 10 [Id]
  ,[Id_parvandeh]
  ,[FirstName]
  ,[LastName]
  ,[RegDate]
  ,[Gilder]
  ,[Nationality]
  ,[Educ]
  ,[PhoneNumber]
  ,[DueInMashhad]

  ,[EzdevajDate]


  ,[MarriageStatus]
  ,[Gender]
  ,[Photo]

  ,[ModifiedOn]
  ,[CreatorIp]
   From
  [dbo].[Socials] where educ >= 3 or EzdevajDate  >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1

答案 10 :(得分:1)

如果它的日期在24小时内,从早上开始到晚上结束,则应添加如下内容:

declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'

答案 11 :(得分:1)

最佳查询当前日期与返回三天之间的选择日期:

  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)   

答案 12 :(得分:1)

检查以下示例:工作和非工作。

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**

以下不起作用:

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**

答案 13 :(得分:1)

我们可以在两者之间使用来显示两个日期数据,但这会搜索整个数据并进行比较,这样就会使我们的流程对于大量数据变慢,所以我建议每个人都使用datediff

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

这里的日历是表格,dt是起始日期变量,dt2是结束日期变量。

答案 14 :(得分:0)

Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;

答案 15 :(得分:0)

我喜欢使用语法&#39; 1 MonthName 2015&#39;日期ex:

   WHERE aa.AuditDate>='1 September 2015'
     AND aa.AuditDate<='30 September 2015'

表示日期

答案 16 :(得分:0)

我会去

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)

答案 17 :(得分:0)

你可以尝试这个SQL

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 

答案 18 :(得分:0)

为了获得最准确的结果,实际上所有sql日期都应采用yyyy-MM-dd格式。

答案 19 :(得分:0)

在该线程中,基于记录可能具有非零时间值的日期范围进行选择(包括撰写本文时的第二高答案)时,存在很多错误的答案和习惯。

请勿使用以下代码:<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel> <ListBox SelectedIndex="{x:Bind Value1, Converter={StaticResource EnumType1Converter}, Mode=TwoWay}" Margin="16"> <ListBoxItem>Foo1</ListBoxItem> <ListBoxItem>Bar1</ListBoxItem> </ListBox> <ListBox SelectedIndex="{x:Bind Value2, Converter={StaticResource EnumType2Converter}, Mode=TwoWay}" Margin="16"> <ListBoxItem>Foo2</ListBoxItem> <ListBoxItem>Bar2</ListBoxItem> </ListBox> </StackPanel> </Grid>

或者这个:Date between '2011/02/25' and '2011/02/27 23:59:59.999'

要了解原因,请自己尝试:

Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'

在两种情况下,您都将获得两行。假设您要查看的日期值是旧的datetime类型,那么与这些日期进行比较时使用的毫秒值999的日期文字将被四舍五入至下一秒的毫秒000,因为datetime不精确到最接近的毫秒。您可以有997或000,但中间不能有任何内容。

可以使用毫秒值997,这将起作用-假设您只需要使用datetime值,而不需要使用datetime2值,因为它们可以更加精确。例如,在这种情况下,您将错过时间值为23:59:59.99872的记录。例如,最初建议的代码还会丢失时间值为23:59:59.9995的记录。

在相同答案中提供的其他解决方案更好-DECLARE @DatetimeValues TABLE (MyDatetime datetime); INSERT INTO @DatetimeValues VALUES ('2011-02-27T23:59:59.997') ,('2011-02-28T00:00:00'); SELECT MyDatetime FROM @DatetimeValues WHERE MyDatetime BETWEEN '2020-01-01T00:00:00' AND '2020-01-01T23:59:59.999'; SELECT MyDatetime FROM @DatetimeValues WHERE MyDatetime >= '2011-02-25T00:00:00' AND MyDatetime <= '2011-02-27T23:59:59.999'; 。在这里,无论您要查看datetime还是datetime2列都无关紧要。

我想提出的另一个关键点是日期和时间文字。 Date >= '2011/02/25' and Date < '2011/02/28'并不是一个好主意-根据您正在使用的系统的设置,可能会出现错误,因为没有25个月了。使用适用于所有地区和语言设置的文字格式,例如'2011/02/25'

答案 20 :(得分:0)

SELECT CITY, COUNT(EID) occurrences from EMP DOB 介于 '31-JAN-1900' 和 '31-JAN-2900' 之间 按城市分组 有计数(EID)> 2;

这是一个。此查询将查找出现超过 2 次的城市,其 DOB 在员工的指定时间范围内。

答案 21 :(得分:-1)

最好这样写:

CREATE PROCEDURE dbo.Get_Data_By_Dates
(
    @EmployeeId INT = 1,
    @Start_Date DATE,
    @End_Date Date
)
AS
Select * FROM Calculation  
    where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN

答案 22 :(得分:-6)

SELECT Date, TotalAllowance  
FROM Calculation  
WHERE EmployeeId = 1 
  AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') 
               AND to_date ('2011/02/27','yyyy-mm-dd');