我有start_date
和end_date
。我想获得这两个日期之间的日期列表。任何人都可以帮我指出我的查询中的错误。
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and Date between 2011/02/25 and 2011/02/27
此处Date
是datetime
变量。
答案 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');