2011-08-20 54 views
2

我試圖讓這個查詢在MS Access:上,TO_CHAR函數沒有定義

SELECT * FROM Clients 
    WHERE UPPER(name) = 'Theil' 
    AND To_Char(date_test,'MM')= 08 
    AND To_Char(date_test, 'yyyy')=2007; 

,但它說,上層是沒有定義,刪除上,只留下名字='泰爾後,現在說沒有定義To_Char。我的問題是,我可以使用to_char和UPPER到where子句中嗎?

如果這是不可能的,我怎樣才能從某些日期等於某些東西的客戶端全部選擇?謝謝。

回答

2

這些都是甲骨文的功能。訪問相當於to_chardatepart

select datepart(yyyy, datetest) 

而且upperucase匹配:

select ucase(name) 
+0

謝謝,你救了我的一天。 :) – Theil

1

建議翻譯:

SELECT * 
    FROM Clients 
WHERE UCASE(name) = 'THEIL' 
     AND FORMAT(date_test,'MM') = '08' 
     AND FORMAT(date_test, 'yyyy') = '2007'; 

注意周圍的文本文字值引號。此外,我已經將字面值'THEIL'更改爲大寫,因爲它更有意義:)(但是,無論如何,您可能會發現您使用的是不區分大小寫的校對)。

但是,總的來說,我認爲這是最好使用時間的功能與時間數據:現在

SELECT * 
    FROM Clients 
WHERE UCASE(name) = 'THEIL' 
     AND DATEPART('M', date_test) = 8 
     AND DATEPART('YYYY', date_test) = 2007; 

注相同的價值觀是SMALLINT類型的文字。

+0

Access數據庫引擎支持Year()和Month()函數。 DatePart()是否比它們有優勢? – HansUp

+0

@HansUp:'DatePart()'更接近OP的原始代碼,否則我認爲沒有理由偏好另一個。 – onedaywhen

1

由於您想從2007年8月起使用date_test值的行,因此您可以在WHERE子句中使用文字日期值來指示適當的日期範圍。此方法將允許數據庫引擎利用date_test上的索引,因此可能比使用Format()或DatePart()等函數的建議快得多。

SELECT * 
FROM Clients 
WHERE 
    UCase([name]) = 'THEIL' 
    AND date_test >= #2007/08/01# 
    AND date_test < #2007/09/01#; 

我封閉用方括號,因爲它是一個保留字。

+0

我有一種感覺,文字是現實中的參數。但如果它們真的是常量,那麼使用日期文字就很有意義。 – onedaywhen

+0

...並且應該考慮'PRIMARY KEY'(聚簇索引)的'date_test'部分。 – onedaywhen