2010-03-14 103 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) 
相關問題