我有一个start_date和end_date。我想要得到这两个日期之间的日期列表。有人能帮我指出我的查询中的错误吗?
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and Date between 2011/02/25 and 2011/02/27
这里Date是一个datetime变量。
我有一个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'
日期值需要作为字符串输入。
为了确保您的SQL Server 2008及更高版本的查询能够适应未来,Date应该被转义,因为在以后的版本中它是一个保留字。
请记住,没有时间的日期将午夜作为默认值,因此这里可能没有正确的值。
你应该把这两个日期放在单引号之间,比如..
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”。
该查询适用于获取当前日期和接下来3个日期之间的值
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
这最终将为当前日期增加额外3天的缓冲时间。
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
——如果数据类型不同
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 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');
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
由于没有指定时间段的datetime将具有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'
如果日期在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 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 Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
我喜欢使用1 MonthName 2015语法来表示日期:
WHERE aa.AuditDate>='1 September 2015'
AND aa.AuditDate<='30 September 2015'
对日期
例子:工作和非工作。
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**
我会选择
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)
这是非常古老的,但考虑到我有很多关于日期的经验,你可能会考虑这个:人们使用不同的区域设置,因此,一些人(以及一些数据库/计算机,取决于区域设置)可能会将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'
你可以试试这个SQL
select * from employee where rec_date between '2017-09-01' and '2017-09-11'
我们可以使用between来显示两个日期数据,但这将搜索整个数据并进行比较,因此对于巨大的数据,它会使我们的过程变慢,所以我建议每个人都使用datediff:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
这里的日历是表,dt作为开始日期变量,dt2是结束日期变量。
/****** 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
在这个线程中有很多糟糕的答案和习惯,当涉及到根据记录可能具有非零时间值的日期范围进行选择时——包括写作时第二高的答案。
永远不要使用这样的代码:Date between '2011/02/25' and '2011/02/27 23:59:59.999'
或者这样:日期>= '2011/02/25'和日期<= '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并不精确到最近的毫秒。你可以有99.7或7000,但没有介于两者之间的。
您可以使用997毫秒值,这就可以工作了——假设您只需要使用datetime值,而不需要使用datetime2值,因为这些值可以更精确。例如,在这种情况下,您将错过时间值为23:59:59.99872的记录。例如,最初建议的代码也会错过时间值为23:59:59.9995的记录。
更好的是同一答案中提供的另一个解决方案-日期>= '2011/02/25'和日期< '2011/02/28'。在这里,无论查看的是datetime列还是datetime2列,都可以正常工作。
我想提出的另一个关键点是日期和时间字面量。'2011/02/25'不是一个好主意-取决于您正在工作的系统的设置,这可能会抛出一个错误,因为没有第25个月。使用适用于所有位置和语言设置的文字格式,例如。“2011 - 02 - 25 - t00:00:00”。
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次的城市。
两件事:
使用引号 确保包括最后一天(结束于24) 选择日期,总津贴 从计算 EmployeeId = 1 and "2011/02/25" <= Date and Date <= "2011/02/27"
如果Date为DateTime。
我倾向于以这种方式进行范围检查,因为它清楚地显示了下限和上限。请记住,日期格式在不同的文化中有很大的不同。所以你可能要确保它被解释为一个日期。使用DATE_FORMAT(日期,'Y/m/d')。
(提示:使用STR_TO_DATE和DATE_FORMAT来切换范例。)
这对我很有效
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