我正在嘗試選擇頭銜、姓氏、出生日期和頭銜為“銷售代表”的國家,并且他們出生于 1950 年之前或 1950 年。
當將日期放入代碼中時,它給了我一個錯誤。
我認為這是正確的:
SELECT title,lastname,birthdate,country FROM EMPLOYEES
WHERE title='Sales Representative' AND BIRTHDATE <= '01/01/1950 00:00:00';
它給出的錯誤ORA-01843: not a valid month
如果你能幫助我,謝謝。
這是表的示例資料:

uj5u.com熱心網友回復:
使用 ANSI 日期文字
and birthdate <= date '1950-01-01'
或使用to_date包含格式掩碼的顯式
and birthdate <= to_date( '01/01/1950 00:00:00'
,'MM/DD/YYYY HH24:MI:SS' )
否則,Oracle 將嘗試使用會話設定的任何內容進行從字串到日期的隱式轉換nls_date_format。這通常會產生問題,因為不同的人、不同的應用程式等都可能會以不同的方式設定他們的 NLS 設定。因此,您可以非常輕松地撰寫適合您的代碼,但當您的隊友連接到相同的資料庫或代碼在一個工具中為您作業但由于環境配置方式不同而無法在另一個工具中作業時失敗。
uj5u.com熱心網友回復:
您可以使用嚴格小于生日的日期文字,例如
...
WHERE title='Sales Representative'
AND birthdate < date'1951-01-01'
使查詢回傳包含 1950 年的所需值,而如果列上有索引,則可能會使索引birthdate受益,因為沒有對其應用強制轉換、轉換或函式。
uj5u.com熱心網友回復:
您可以使用EXTRACT并檢查年份是否 <= 1950:
...WHERE...AND EXTRACT (YEAR FROM birthdate) <= 1950...
如果不應該包含 1950,則取 < 1950 而不是 <= 1950(您的描述告訴它應該包含,您自己的查詢不會)。
uj5u.com熱心網友回復:
您可以嘗試僅輸入您想要的year本身,
SELECT title,lastname,birthdate,country FROM EMPLOYEES
WHERE title='Sales Representative' AND EXTRACT(YEAR FROM
TO_DATE(BIRTHDATE, 'DD-MON-YYYY')) <= 1950
ORDER BY BIRTHDATE
uj5u.com熱心網友回復:
Oracle 資料庫通常配置有 DD-MON-YY 或 DD-MON-YYYY 的默認日期格式。
如果您想使用不同的格式,您必須告訴 Oracle 格式是什么。所以:
SELECT title,lastname,birthdate,country
FROM EMPLOYEES
WHERE title='Sales Representative'
AND BIRTHDATE <= TO_DATE('01/01/1950 00:00:00', 'DD/MM/YYYY HH24:MI:SS');
使用默認值,無需提供格式掩碼:
SELECT title,lastname,birthdate,country
FROM EMPLOYEES
WHERE title='Sales Representative'
AND BIRTHDATE <= TO_DATE('01-JAN-1950');
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/481645.html
