我已经写在SQL Server以下查询相关日期范围:问题在SQL Server
SELECT *
FROM AttendanceMaster
WHERE Date between '8/12/2012' AND '8/20/2012'
对接查询结果返回“2012年8月13日”和“2012年8月19日”
但它不返回日期2012年12月8日和日期2012年8月20日的结果
那么如何获得上述两个日期的数据的解决方案是什么?
我已经写在SQL Server以下查询相关日期范围:问题在SQL Server
SELECT *
FROM AttendanceMaster
WHERE Date between '8/12/2012' AND '8/20/2012'
对接查询结果返回“2012年8月13日”和“2012年8月19日”
但它不返回日期2012年12月8日和日期2012年8月20日的结果
那么如何获得上述两个日期的数据的解决方案是什么?
它不是TO
而是AND
select *
from AttendanceMaster
where Date between '8/12/2012' AND '8/20/2012'
尝试铸造日期
SELECT *
FROM AttendanceMaster
WHERE CAST([Date] AS DATE) BETWEEN CAST('2012-08-12' AS DATE) AND CAST('2012-08-20' AS DATE)
Thankx为您的答案,但是,我试过你的查询..仍然我得到了相同的结果 –
我试过你的查询仍然有相同的错误?为什么? –
尝试投射日期'CAST([Date] AS DATE)'查看我更新的答案 –
与下面的查询尝试:
SELECT *
FROM AttendanceMaster
WHERE CAST(Date AS DATETIME)
BETWEEN DATEADD(DAY , -1 ,CAST('2012-08-12' AS DATETIME)) AND
DATEADD(DAY , 1 ,CAST('2012-08-20' AS DATETIME));
如果您使用的是SQL Server 2008中,你只需要做这样的事情:
SELECT *
FROM AttendanceMaster
WHERE CONVERT(DATE, [Date]) BETWEEN CAST('2012-08-12' AS DATE) AND CAST('2012-08-20' AS DATE)
编辑:我在这里做2个假设。
1)您确实已经确认您的AttendanceMaster表中的数据[日期]等于2012年8月12日和/或20日 - 您不希望查找甚至不存在第一名;)
2)将[日期]列是最有可能DATETIME SQL服务器类型
如果你给出日期'2012-08-12'
和'2012-08-20'
然后返回'2012-08-12 0:00 AM'
和'2012-08-20 0:00 AM'
之间的数据所以不返回的来自'2012-08-12'
日期的值。所以,你需要如果您有前一个变量的日期'2012-08-20'
写的目标日期为'2012-08-21'
:
DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME
SET @FromDate = '2012-08-12'
SET @ToDate = '2012-08-20'
DECLARE @NextDate DATETIME
SET @NextDate=CAST(FLOOR(CAST(dateadd(day,1,@ToDate) AS FLOAT)) AS DATETIME)
/*This Returns the Next Day Date.*/
SELECT *
FROM AttendanceMaster
WHERE Date between @Date AND @NextDate
或者你可以写为
DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME
SET @FromDate = '2012-08-12'
SET @ToDate = '2012-08-20'
SELECT *
FROM AttendanceMaster
WHERE Date between @Date AND CAST(FLOOR(CAST(dateadd(day,1,@ToDate) AS FLOAT)) AS DATETIME)
'2012-08-12'对于某些区域设置仍然不明确。无论使用哪种语言设置,“20120812”都是安全的。如果你打算去第二天,开始使用包含开始日期和独占结束日期('Date> = @Date和Date <@NextDate')而不是'BETWEEN'通常会更好。 –
好的,谢谢你的信息。 –
我建议你使用<, <=, >=, or >
,因为它们比BETWEEN允许更多的灵活性,您可以选择包含或排除端点。 所以,你可以重写查询这样
SELECT *
FROM AttendanceMaster
WHERE Date > '8/12/2012 00:00:00' AND Date < '8/21/2012 00:00:00'
PLZ注意,在上面的查询的结束日期是21日,而不是20日。
另外请记住,默认情况下,SQL Server将采用任何日期,如'8/20/2012'AS'2012年8月20日00:00:00',因此如果您使用BETWEEN或者如果你没有指定确切的时间戳。
希望它有帮助。
包含开始('> =')和排除结束('<')通常是首选形式,并且最容易推理(您当前的查询排除*出现在*处的任何内容*''2012-08-12T00:00 :00'') –
@Damien_The_Unbeliever我说的'<,>,<=,> ='可以灵活地包含/排除任何你想要的东西。在这里,如果OP希望包括00:00:00,他只需要将'>'更改为'> ='。无论如何,你是否知道为什么人们更喜欢'BETWEEN'这些运营商。 – Luftwaffe
我只是指出,使用'datetimes'时最常用的形式是包容性的,排他性的。不,我不会选择'BETWEEN',因为它不提供这个选项。 –
这些日期栏或日期时间栏,你的意思是2012年8月12日,而不是2012年12月8日在文本?此外,更好地使用查询日期的长表格:2012-08-12和2012-08-20 –