2010-03-14 117 views
1

我需要查询帮助查找所有日期是31/12/2009和31/02/2010之间需要找到2日的日期之间的SQL Server 2008中

在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' 

,但它给我错误的结果

为什么呢?

+0

你应该从问题的一个例子澄清你的问题。 – 2010-03-14 16:08:09

回答

0

BOL始终是一个很好的参考...

开始BETWEEN

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 
+0

是的,这就是我认为OP的含义。 – 2010-03-14 15:39:03

+0

感谢您的帮助,我需要一些简单的选择...#03/03/2010..between ...和我需要这种日期格式(dd/mm/yyyy) – Gold 2010-03-14 15:48:00

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标准进行日期。对于连接到数据库的应用程序,请始终使用绑定参数。如果您正在做其他任何事情,那么您正在编写的代码不可靠,不安全,或者两者兼而有之。

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) 
相关问题