2012-10-02 127 views
0

我已经写在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日的结果

那么如何获得上述两个日期的数据的解决方案是什么?

+0

这些日期栏或日期时间栏,你的意思是2012年8月12日,而不是2012年12月8日在文本?此外,更好地使用查询日期的长表格:2012-08-12和2012-08-20 –

回答

0

它不是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) 
+0

Thankx为您的答案,但是,我试过你的查询..仍然我得到了相同的结果 –

+0

我试过你的查询仍然有相同的错误?为什么? –

+0

尝试投射日期'CAST([Date] AS DATE)'查看我更新的答案 –

1

与下面的查询尝试:

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)); 
0

如果您使用的是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服务器类型

0

如果你给出日期'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) 
+0

'2012-08-12'对于某些区域设置仍然不明确。无论使用哪种语言设置,“20120812”都是安全的。如果你打算去第二天,开始使用包含开始日期和独占结束日期('Date> = @Date和Date <@NextDate')而不是'BETWEEN'通常会更好。 –

+0

好的,谢谢你的信息。 –

0

我建议你使用<, <=, >=, 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或者如果你没有指定确切的时间戳。
希望它有帮助。

+0

包含开始('> =')和排除结束('<')通常是首选形式,并且最容易推理(您当前的查询排除*出现在*处的任何内容*''2012-08-12T00:00 :00'') –

+0

@Damien_The_Unbeliever我说的'<,>,<=,> ='可以灵活地包含/排除任何你想要的东西。在这里,如果OP希望包括00:00:00,他只需要将'>'更改为'> ='。无论如何,你是否知道为什么人们更喜欢'BETWEEN'这些运营商。 – Luftwaffe

+0

我只是指出,使用'datetimes'时最常用的形式是包容性的,排他性的。不,我不会选择'BETWEEN',因为它不提供这个选项。 –