我有一个 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 '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'
由于没有指定时间段的日期时间的值为 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'
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
,因为它在更高版本中是保留字。
请记住,没有时间的日期将午夜作为默认值,因此您可能没有正确的值。
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
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
-- 如果数据类型不同
此查询适用于获取当前日期与其接下来的 3 个日期之间的值
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
这最终会为当前日期增加额外 3 天的缓冲时间。
这是非常古老的,但鉴于我在约会方面的很多经验,您可能需要考虑这一点:人们使用不同的区域设置,因此,有些人(以及一些数据库/计算机,取决于区域设置)可能会阅读此内容日期 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'
尝试将日期放在 # # 之间,例如:
#2013/4/4# and #2013/4/20#
它对我有用。
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
如果它的日期在 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'
我会去
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 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 次的城市。
当前日期和过去三天之间选择日期的最佳查询:
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 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**
你可以试试这个 SQL
select * from employee where rec_date between '2017-09-01' and '2017-09-11'
我喜欢对日期使用语法 1 MonthName 2015
,例如:
WHERE aa.AuditDate>='1 September 2015'
AND aa.AuditDate<='30 September 2015'
dates
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
我们可以使用 between 来显示两个日期数据,但这会搜索整个数据并进行比较,因此对于大量数据会降低处理速度,因此我建议大家使用 datediff
:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
这里calender是表,dt是开始日期变量,dt2是结束日期变量。
在根据记录可能具有非零时间值的日期范围进行选择时,此线程中有很多不好的答案和习惯 - 包括撰写本文时的第二高答案。
永远不要使用这样的代码: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'
。
实际上,所有 sql 日期都应该采用 yyyy-MM-dd
格式以获得最准确的结果。
DATE_FORMAT
和 STR_TO_DATE
函数
两件事情:
使用引号确保包括最后一天(以 24 结束)从计算中选择日期、TotalAllowance where EmployeeId=1 and "2011/02/25" <= Date and Date <= "2011/02/27"
如果 Date
是 日期时间。
我倾向于以这种方式进行范围检查,因为它清楚地显示了上下边界。请记住,日期格式在不同的文化中差异很大。所以你可能想确保它被解释为一个日期。使用 DATE_FORMAT( Date, 'Y/m/d')
。
(提示:使用 STR_TO_DATE
和 DATE_FORMAT
切换范例。)
/****** 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
最好这样写:
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
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');
between
应该按预期工作。