[英]Comparing Dates in Oracle SQL
我試圖讓它顯示 1994 年 6 月 20 日之后雇用的員工人數,
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
但我得到一個錯誤說
“JUN”無效標識符。
請幫忙,謝謝!
31-DEC-95
不是字符串, 20-JUN-94
也不是。 它們是最后添加了一些額外內容的數字。 這應該是'31-DEC-95'
或'20-JUN-94'
- 注意單引號'
。 這將使您能夠進行字符串比較。
但是,您沒有進行字符串比較; 你正在做一個日期比較。 您應該將字符串轉換為日期。 通過使用內置TO_DATE()
函數或日期文字。
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
這種方法有一些不必要的陷阱
DEC
不一定意味着 12 月。 這取決於您的NLS_DATE_LANGUAGE
和NLS_DATE_FORMAT
設置。 為確保您的比較適用於任何語言環境,您可以改用日期時間格式模型MM
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
日期文字是 ANSI 標准的一部分,這意味着您不必使用 Oracle 特定的函數。 使用文字時,您必須以YYYY-MM-DD
格式指定日期,並且不能包含時間元素。
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
請記住,Oracle 日期數據類型包含一個時間元素,因此沒有時間部分的日期相當於1995-12-31 00:00:00
。
如果要包含時間部分,則必須使用時間戳文字,其格式YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
NLS_DATE_LANGUAGE
派生自NLS_LANGUAGE
並且NLS_DATE_FORMAT
派生自NLS_TERRITORY
。 這些是在您最初創建數據庫時設置的,但可以通過更改初始化參數文件(僅在確實需要時)或在會話級別使用ALTER SESSION
語法來更改它們。 例如:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
這表示:
DD
數字日期,1 - 31MM
一年中的數字月份,01 - 12(一月是 01)YYYY
4 位數年份 - 在我看來,這總是比 2 位數年份YY
好,因為與您所指的世紀沒有混淆。HH24
小時,0 - 23MI
分鍾,0 - 59SS
分秒,0-59 您可以通過查詢V$NLS_PARAMETERSs
找到您當前的語言和日期語言設置,並通過查詢V$NLS_VALID_VALUES
有效值的全部范圍。
順便說一句,如果你想要count(*)
你需要按employee_id
分組
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
這為您提供了每個employee_id
的計數。
結論,
to_char
以自己的方式工作
所以,
始終使用此格式YYYY-MM-DD進行比較,而不是MM-DD-YY或DD-MM-YYYY或任何其他格式
您可以按如下方式使用 trunc 和 to_date:
select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.*
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;
根據您的查詢:
Select employee_id, count(*) From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95'
我認為它不顯示 1994 年 6 月 20 日之后雇用的員工人數。如果要顯示員工人數,可以使用:
Select count(*) From Employee
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620
我認為最佳做法是比較您可以使用的日期:
employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
單引號必須在那里,因為日期轉換為字符。
Select employee_id, count(*) From Employee Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.