ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一个 start_dateend_date。我想获取这两个日期之间的日期列表。谁能帮我指出查询中的错误。

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

这里 Date 是一个 datetime 变量。


F
Filippos Zofakis

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

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'


SQL Server 将没有时间的日期默认为 00:00:00。那么这个查询不会在午夜返回 2011/02/25 和 2011/02/26 的任何内容吗?
@Deepak,您的第二位应该说 >= 和 <=
您可能会提到 BETWEEN 函数中的顺序很重要。它必须从左边最旧的开始,右边是最近的。这是不直观的,因为 = 是 sql 中的比较运算符,适用于 where 子句中的“EmployeeId = 1”或“1 = EmployeeId”。
@Matt,根据 between 的文档,如果一行的日期为 2011/02/27 没有时间,则该行相当于日期为 2011/02/27 00:00 并将返回在查询中,因为它小于或等于 2011/02/27 00:00。因此,如果您不处理时间,between 应该按预期工作。
@timctran 对,但是 2011/02/27 00:00 是我们所说的 2011/02/26 午夜。据推测,查询意味着将 27th 包含在结果集中——但不会包含时间戳为 2011/02/27 5:00 的条目。
T
Tom Fenech

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

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

或者

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

或者

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'

人们仍然会查看这些问题和答案,即使它们最初是在一段时间前提出的。我来寻找答案,我在这里看到的大部分内容都不完整或绝对不正确。我的回答不会帮助原始海报,但它可能会帮助某人,甚至可能是三年后。
@WelshDragon,您的回答对我有很大帮助-其他答案忽略了日期格式需要在服务器上为“简单日期”以忽略小时数的事实。 “<= END_DATE”假设是 12AM,我不知道。我正在使用“... <= 01/01/2014”执行查询,但我无法弄清楚为什么该日期的订单没有显示为第一天。非常感谢。
@WelshDragon - 您的答案是使用日期作为 where 子句的非常好的材料。谢谢
今天试过了,你也可以使用 convert(date, Date) between '2011/02/25' and '2011/02/27'(至少在最近的 MS SQL Server 上)。 convert() 部分将负责剥离时间部分,然后之间的比较将按预期工作。
不要使用 Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999' 或中间版本。这些都是错误的,将返回值为 '2011-02-28T00:00:00' 的记录。也不要太想使用 23:59.59.997 的神奇时间,这更可靠 - 但仅适用于日期时间列。 Datetime2 可以有更高的精度,所以这种比较不是你想要养成的习惯。请改用 Date >= '2011-02-25T00:00:00' and Date < '2011-02-28T00:00:00';这个没有缺点。
佚名

尝试这个:

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

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

为确保对 SQL Server 2008 及更高版本的查询不会过时,应转义 Date,因为它在更高版本中是保留字。

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


日期不是关键字,不需要转义。语法高亮只是语法高亮,关键字只有在导致语法错误时才需要转义。使用显式转换而不是日期字符串常量的隐式转换也是一个好习惯。 - 和 CAST('2011/02/25'AS DATETIME) 和 CAST('2011/02/27'AS DATETIME) 之间的日期
如果这是 OP 标记的 SQL Server 2005,那么您当然是对的。但是,Date 是在 2008 年及以后保留的,因此对于未来的验证,逃避它并没有什么坏处。我已经编辑了我的答案。
如果他为两者指定单个日期,它将返回零行,但我想这不是操作的要求
S
Sabyasachi Mishra
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

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

-- 如果数据类型不同


T
Tony

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

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

这最终会为当前日期增加额外 3 天的缓冲时间。


H
Hannington Mambo

这是非常古老的,但鉴于我在约会方面的很多经验,您可能需要考虑这一点:人们使用不同的区域设置,因此,有些人(以及一些数据库/计算机,取决于区域设置)可能会阅读此内容日期 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';

另请注意,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' 

你的信息帮助我完成了任务。我已经为此工作了 10 多个小时,但没有一个答案对我有用。当我像你一样连接时,我的项目效果很好。但规则似乎是不要写这样的 SQL 语句。每当我尝试设置 SqlCommand 以将日期参数添加到 SQL 语句时,这些参数将不会附加,并且我收到错误,我必须声明“@startDate”和“@endDate”。我无法通过这个问题。我尝试了您的日期格式“dd MMM yyyy”,它有效,我还尝试了“yyyy MMM dd”,它也执行了相同的操作。
太好了,它有帮助!以上是代码示例。声明和使用参数来避免 SQL 注入总是更好。看来您已经受到项目规则的要求/保护,这很好。
h
halfer

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

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

它对我有用。


# 在这种情况下做什么?
@BK 它是一个分隔符,就像字符串的引号一样。 “当为 SQL 语句提供值时,例如作为查询条件,它们的数据类型必须由“限定符”正确定义。这是通过将值括在一对适当的字符之间来完成的。”参考 --> link
@BK 如果它是 TSql 语法,则需要使用单引号 (') 才能获得所需的内容。参考 *basics of sql-fontstuff.com * Beginning SQL - Paul Wilton, John Colby
再清楚不过了,问题是针对 SQL Server 和 T-SQL 的。 T-SQL 和 SQL Server 不接受哈希标记之间的日期,它接受单引号之间的日期。这个答案是错误的。
@TT。赞成票的数量表明它仍然对某人有所帮助。在我写答案的时候,已经选择了接受的答案。尽管如此,我写这篇文章是为了帮助任何可能从谷歌或其他地方来到这里的人:)
s
shA.t
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'

S
Sheryar Nizar

如果它的日期在 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'

e
entonio

我会去

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)

D
Damini Suthar
SELECT CITY, COUNT(EID) OCCURENCES FROM EMP 
WHERE DOB BETWEEN '31-JAN-1900' AND '31-JAN-2900' 
GROUP BY CITY 
HAVING COUNT(EID) > 2;

此查询将查找其 DOB 位于员工指定时间范围内的出现次数超过 2 次的城市。


不太确定这与 OP 有什么关系。你能详细说明一下吗?
这是问题的真正答案。问题是如何使用 between 以及他的查询有什么问题,它是 ' 或 " 而不是将子句分成 2
P
Paresh Mayani

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

  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)   

E
Eloims

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

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

或者

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

或者

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

K
Keyur Padalia

你可以试试这个 SQL

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

R
Rakesh kumar Oad

我喜欢对日期使用语法 1 MonthName 2015,例如:

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

dates


为什么会这样?
为了使其对其他开发者更具可读性并避免错误,不同国家/地区对日期 dd/mm/yy 与 mm/dd/yy 等有不同的格式calendars.wikia.org/wiki/Date_format_by_country
三月拼写为 März 我来自哪里
英语也不是我的主要语言,但如果我看到 2011 年 3 月 6 日,我可能会认为那是 2011 年 3 月 6 日,但也可能是 2011 年 6 月 3 日。我不会用我提到的语法犯那个错误
s
shA.t
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;

B
Bipul Roy

我们可以使用 between 来显示两个日期数据,但这会搜索整个数据并进行比较,因此对于大量数据会降低处理速度,因此我建议大家使用 datediff

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

这里calender是表,dt是开始日期变量,dt2是结束日期变量。


R
Richard Abey-Nesbit

在根据记录可能具有非零时间值的日期范围进行选择时,此线程中有很多不好的答案和习惯 - 包括撰写本文时的第二高答案。

永远不要使用这样的代码: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'

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

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 类型,用于与这些日期进行比较的毫秒值为 999 的日期文字将四舍五入到下一秒的毫秒 000,因为 datetime 并不精确最接近的毫秒。您可以有 997 或 000,但两者之间没有。

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

相同答案中提供的另一个解决方案要好得多 - Date >= '2011/02/25' and Date < '2011/02/28'。在这里,无论您查看的是 datetime 还是 datetime2 列都没有关系,无论如何这都可以。

我想提出的另一个关键点是日期和时间文字。 '2011/02/25' 不是一个好主意 - 根据您正在使用的系统的设置,这可能会引发错误,因为没有第 25 个月。使用适用于所有地区和语言设置的文字格式,例如 '2011-02-25T00:00:00'


哪些是不好的答案或习惯?
R
Rakesh kumar Oad

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


数据库中的日期是数据库中的日期。在表示层上,您可能想要使用 DATE_FORMATSTR_TO_DATE 函数
t
theking2

两件事情:

使用引号确保包括最后一天(以 24 结束)从计算中选择日期、TotalAllowance where EmployeeId=1 and "2011/02/25" <= Date and Date <= "2011/02/27"

如果 Date日期时间

我倾向于以这种方式进行范围检查,因为它清楚地显示了上下边界。请记住,日期格式在不同的文化中差异很大。所以你可能想确保它被解释为一个日期。使用 DATE_FORMAT( Date, 'Y/m/d')

(提示:使用 STR_TO_DATEDATE_FORMAT 切换范例。)


M
Mojtaba Nava
/****** 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

我有点迷失为什么其他列在你的答案中
T
TobiasR.

最好这样写:

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

在这种情况下使用存储过程没有任何意义,因为它会极大地降低 SQL 查询的灵活性,它会非常具体,如果您不想在非常具体的情况下使用它,请不要使用存储过程 - 您的存储过程还有许多改进可用,您可以在此社区中找到它们;)。
P
Philipp
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');

当您编写此答案时,您可能正在考虑 Oracle SQL。这在 Oracle 中有效。在 SQL Server 中没有那么多(据我所知)。