获取不同年份的2个日期之间的确定日期

问题描述:

Declare @FromDate as datetime, 
     @ToDate as datetime 

set @FromDate = '2000-01-01', 
    @ToDate = '2001-01-01' 

Select * 
from Mytable 
Where 
    Convert(varchar,ses_begin_date,101) >= Convert(varchar,@FromDate, 101) 
    AND Convert(varchar,ses_begin_date, 101) <= Convert(varchar,@ToDate,101) 

尽管里面已经有数据,但它不返回任何数据。获取不同年份的2个日期之间的确定日期

+4

为什么你处理日期为varchar? –

+0

尤其不好,使用格式101生成的字符串不会像日期那样排序,并且在这里生成两个字符串,其中没有其他可能的日期值出现在它们之间。 –

您不需要转换。只要使用这个

Declare @FromDate as datetime, 
     @ToDate as datetime 

set @FromDate = '2000-01-01', 
    @ToDate = '2001-01-01' 

Select * 
from Mytable 
Where 
    ses_begin_date>= @FromDate 
    AND ses_begin_date<= @ToDate 

此外,如果你的目标是让所有的数据,2000年,使用

Declare @FromDate as datetime, 
     @ToDate as datetime 

set @FromDate = '2000-01-01', 
    @ToDate = '2001-01-01' 

Select * 
from Mytable 
Where 
    ses_begin_date>= @FromDate 
    AND ses_begin_date< @ToDate 

Select * 
from Mytable 
Where 
    ses_begin_date>='2000-01-01' 
    AND ses_begin_date<= '2001-01-01' 

使用DateDiff函数

Select * 
From Table 
Where Datediff(day,@datefrom, ses_begin_date)<=0 
and Datediff(day,ses_begin_date,@dateto)<=0 
+0

虽然这可能是正确的,但我不会建议您使用此功能,因为这可以使您的查询变得不可靠。 –

+0

是为此目的在关键字之间使用 –

如果您正在使用比2005年更高的SQL Server。 2008或以上的查询将会产生日期范围内的所有记录。

您没有获取记录,因为您使用的是“日期时间”,其中也包含可能不会产生所有必需记录的时间部分。但是,如果范围仅包含日期部分,则应在比较时将其转换为“日期时间”或“日期”类型。

这应该工作。

DECLARE 
    @FromDate DATE , 
    @ToDate DATE; 

SELECT @FromDate = '2000-01-01', 
    @ToDate = '2001-01-01' 

要么

SELECT 
    * 
FROM 
    @temp 
WHERE 
    (CONVERT(DATE, ses_begin_date) >= @FromDate 
    AND CONVERT(DATE, ses_begin_date) <= @ToDate) 

或者

SELECT 
    * 
FROM 
    @temp 
WHERE 
    (CONVERT(DATE, ses_begin_date) BETWEEN @FromDate AND @ToDate). 

如果您使用的版本低于比2008年多一条路可将其转换为“int”删除日期部分比作比较。即。

DECLARE 
    @FromDate int , 
    @ToDate int; 

SELECT @FromDate = CONVERT(INT, CONVERT(VARCHAR(10),'2000-01-01',112)), 
    @ToDate = CONVERT(INT, CONVERT(VARCHAR(10),'2001-01-01',112)) 

--Either

SELECT 
    * 
FROM 
    @temp 
WHERE 
    (CONVERT(INT, CONVERT(VARCHAR(10), ses_begin_date, 112)) >= @FromDate 
    AND CONVERT(INT, CONVERT(VARCHAR(10), ses_begin_date, 112)) <= @ToDate) 

--Or

SELECT 
    * 
FROM 
    @temp 
WHERE 
    (CONVERT(INT, CONVERT(VARCHAR(10), ses_begin_date, 112)) BETWEEN @FromDate AND @ToDate)