需要在SQL Server 2008中找到2个日期之间的日期

时间:2010-03-14 15:26:21

标签: sql-server-2008

我需要查询帮助才能找到31/12/2009和31/02/2010之间的所有日期

在SQL Server 2008中

我试试这个:

SELECT  convert(varchar(50), MyDate, 103)
where convert(varchar(50), MyDate, 103) >= '31/12/2009' and convert(varchar(50), MyDate, 103) <='31/02/2010'

但它给我错误的结果

为什么?

4 个答案:

答案 0 :(得分:3)

我对这个问题有不同的解释:“如何生成某个范围之间的所有日期?”

以下是解决方案:

--define start and end limits
Declare @todate datetime, @fromdate datetime
Select @fromdate='2009-03-01', @todate='2009-04-10' 

;With DateSequence( Date ) as
(
    Select @fromdate as Date
        union all
    Select dateadd(day, 1, Date)
        from DateSequence
        where Date < @todate
)

--select result
Select * from DateSequence option (MaxRecursion 1000)

有一个很好的article,它展示了如何使用CTE生成序列(数字,日期,时间)。


修改

澄清后,问题似乎是输入的日期格式:dd / mm / yyyy。

SQL Server期望格式为mm / dd / yyyy。

我会在运行select语句之前简单地对其进行转换:

-- Assuming two variables, @inputFromDate and @inputToDate, in the format of dd/mm/yyyy...

declare @fromDate varchar(10), @toDate varchar(10)
set @fromDate = 
substring(@inputFromDate, 3, 2) + '/' + 
substring(@inputFromDate, 1, 2) + '/' + 
substring(@inputFromDate, 7, 4)

set @toDate = 
substring(@inputToDate, 3, 2) + '/' + 
substring(@inputToDate, 1, 2) + '/' + 
substring(@inputToDate, 7, 4)

select * from SomeTable where dateCol >= @fromDate and dateCol < @toDate
-- you can change the < or >= comparisons according to your needs

答案 1 :(得分:1)

如果MyDate列是datetime,就像它看起来一样,那么它已经是正确的“格式”。 不要在谓词条件中将其转换为varchar(50) - 这会使您的查询无法搜索,并且会破坏您可能拥有的任何索引的性能。

相反,请将您的参数设为datedatetime个实例:

SELECT ...
FROM MyTable
WHERE MyDate >= @BeginDate
AND MyDate <= @EndDate

您的查询不应该依赖于输入参数中的特定日期格式 - 这些参数不是varchar类型,而是datetime(或date)。当您从应用程序所在的任何环境运行此查询或存储过程并提供绑定参数时( 使用绑定参数,对吗?),所述库将自动处理任何格式问题。

如果您尝试在日期的字符表示中使用>=<=运算符,使用ISO标准yyyymmdd以外的任何格式,您将得到错误的结果,因为字母顺序与时间顺序不同。不要这样做。

如果您只需要编写即席查询,即不从任何编程环境运行,那么就不要使用dd/mm/yyyy格式。改为使用ISO日期格式;它是明确的,可以隐式转换为datetime值:

SELECT ...
FROM MyTable
WHERE MyDate >= '20091231'
AND MyDate <= '20100231'

老实说,在我看来,没有其他解决方案是可以接受的。对于即席查询,请始终对日期使用明确的ISO标准。对于连接到数据库的应用程序,请始终使用绑定参数。如果您正在做其他任何事情,那么您编写的代码不可靠,不安全或两者兼而有之。

答案 2 :(得分:0)

BOL总是很好的参考......

BETWEEN

开始

答案 3 :(得分:0)

你试过这个:

DECLARE @FROMDATE DATETIME 
DECLARE @TODATE DATETIME 
SET @FROMDATE = GETDATE()
SET @TODATE = GETDATE()+7 
;WITH DATEINFO(DATES) AS (SELECT @FROMDATE UNION ALL SELECT DATES + 1 FROM DATEINFO WHERE DATES < @TODATE) 
SELECT * FROM DATEINFO OPTION (MAXRECURSION 0)