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

Nee*_*raj 270 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

Date是一个datetime变量.

Dee*_*pak 444

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

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'
Run Code Online (Sandbox Code Playgroud)

或者可以使用

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'
Run Code Online (Sandbox Code Playgroud)

  • SQL Server将没有时间的日期默认为00:00:00.所以这个查询在午夜时分不会从2011/02/25和2011/02/26返回任何内容吗? (41认同)
  • @Deepak,你的第二位应该说> =和<= (5认同)
  • 您可能会提到订单在BETWEEN函数中很重要.它必须从左边最古老,右边最近.这是不直观的,因为=是sql中的比较运算符,并且在where子句中适用于"EmployeeId = 1"或"1 = EmployeeId". (3认同)
  • @timctran 是的,但是 2011/02/27 00:00 是我们所说的 2011/02/26 午夜。据推测,该查询意味着将第 27 个条目包含在结果集中,但不会包含时间戳为 2011/02/27 5:00 的条目。 (2认同)

Wel*_*gon 115

由于没有指定时间段的日期时间将具有值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'
Run Code Online (Sandbox Code Playgroud)

要么

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28'
Run Code Online (Sandbox Code Playgroud)

要么

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'
Run Code Online (Sandbox Code Playgroud)

请勿使用以下内容,因为如果时间为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'
Run Code Online (Sandbox Code Playgroud)

  • 人们仍然会看到这些问题和答案,即使它们最初是在一段时间内提出来的.我来寻找答案,我在这里看到的很多内容都是不完整或绝对不正确的.我的回答不会对原版海报有所帮助,但它可能对某人有所帮助,甚至可能在三年之后. (39认同)
  • 你的回答对我很有帮助,@ WelshDragon - 其他答案遗漏了这样一个事实:日期格式需要在服务器上"简单日期"才能忽略小时."<= END_DATE"假设12 AM,我不知道.我正在使用"... <= 01/01/2014"进行查询,我无法弄清楚为什么该日期的订单没有显示为1日.非常感谢你. (3认同)
  • 请勿使用 `Date &gt;= '2011/02/25' 和 Date &lt;= '2011/02/27 23:59:59.999'` 或两者之间的版本。这些都是错误的,将返回值为“2011-02-28T00:00:00”的记录。也不要太想使用神奇的时间 23:59.59.997,它更可靠 - 但仅适用于日期时间列。Datetime2 可以具有更高的精度,因此这种比较不是您想要养成的习惯。使用 `Date &gt;= '2011-02-25T00:00:00' 和 Date &lt; '2011-02-28T00:00:00'` 代替;这个没有什么缺点。 (2认同)

小智 14

试试这个:

select Date,TotalAllowance from Calculation where EmployeeId=1
             and [Date] between '2011/02/25' and '2011/02/27'
Run Code Online (Sandbox Code Playgroud)

日期值需要键入字符串.

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

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

  • 当然,如果这是OP标记的SQL Server 2005,那么你是对的.但是,Date是在2008年及以后保留的,所以为了面向未来,逃避它是没有害处的.我编辑了我的答案. (5认同)

Cha*_*ash 11

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

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

output:
2011/02/25
2011/02/26
2011/02/27
Run Code Online (Sandbox Code Playgroud)


Han*_*mbo 7

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

因此,每当我要与日期和数据库进行交互时,我的政策都是明确的。所以我总是提供我的查询和编程代码如下:

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';
Run Code Online (Sandbox Code Playgroud)

另请注意,Access 将接受 #,因此:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;
Run Code Online (Sandbox Code Playgroud)

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

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

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")
Run Code Online (Sandbox Code Playgroud)

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

对于所问的问题,在最后一个日期上加一天,并进行如下比较:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
Run Code Online (Sandbox Code Playgroud)


小智 5

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

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
Run Code Online (Sandbox Code Playgroud)

这最终将为当前日期添加额外3天的缓冲区.

  • 这不是MS SQL的正确语法。( (3认同)

ham*_*oae 5

select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
Run Code Online (Sandbox Code Playgroud)

- 如果数据类型不同


Ale*_*dar 5

尝试将日期放在 # # 之间,例如:

#2013/4/4# and #2013/4/20#
Run Code Online (Sandbox Code Playgroud)

它对我有用。

  • # 在这种情况下做什么? (2认同)

小智 5

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