我正在尋找一種方法來過濾兩個日期(年份)與運算子之間的到我的 sql 請求,但我不能這樣做。我很難將“Between”整合到“InnerJoin”中我想根據年份用“Between”過濾“Entry_Date”列。
這是我的表的一個例子:患者
| 代碼 | 姓名 | 名 | 性別 | 出生日期 | 安全號碼 | 國家代碼 | 輸入日期 | 原因代碼 |
|---|---|---|---|---|---|---|---|---|
| 1 | 納利 | 杜邦 | F | 09/02/1976 | 3344444448555 | MF | 01/04/2000 | 1 |
這是我的 SQL 請求:
SELECT ALL Patients.Code, Patients.Name, Patients.FirstName FROM Patients
INNER JOIN Pays ON Patients.CountryCode = CountryCode.Code
INNER JOIN Sex ON Patients.Sex = Sex.Code
INNER JOIN ReasonCode ON Patients.ReasonCode = ReasonCode.Code
WHERE Patients.Name LIKE '".$namePatient."%'
AND Patients.ReasonCode LIKE '".$ReasonCode."%'
AND Patients.CountryCode LIKE '".$CountryCode."%'
ORDER BY Patients.Name ASC
預先感謝您的幫助。
uj5u.com熱心網友回復:
如果您想按年份過濾,則不需要 BETWEEN;你可以使用 year 函式:
SELECT ALL Patients.Code, Patients.Name, Patients.FirstName FROM Patients
INNER JOIN Pays ON Patients.CountryCode = CountryCode.Code
INNER JOIN Sex ON Patients.Sex = Sex.Code
INNER JOIN ReasonCode ON Patients.ReasonCode = ReasonCode.Code
WHERE Patients.Name LIKE '".$namePatient."%'
AND Patients.ReasonCode LIKE '".$ReasonCode."%'
AND Patients.CountryCode LIKE '".$CountryCode."%'
AND YEAR(entry_date) = {DesiredYear}
ORDER BY Patients.Name ASC
正如 Pred 所指出的,在 where 子句中使用函式的以下評論可能會導致查詢不使用索引,具體取決于您的平臺
uj5u.com熱心網友回復:
繞過關于涉及運算式而不是列值或文字的謂詞的討論 -
在任何情況下,避免在任何DBMS上的過濾器和連接謂詞中使用運算式都是很好的做法。就像我從不依賴 DBMS 將字串 '42' 隱式轉換為整數一樣。
自由,平等,便攜。您可能需要在新的 SQL 平臺中使用 SQL 代碼,因此請確保您是 DBMS 所做作業的主人而不是受害者。
所以我會計算輸入日期的年份結束,輸入日期的年份開始,并使用 BETWEEN 謂詞。
像這樣,如果你從entry_date. 我已經用這些運算式創建了一個輔助表,然后將輔助表與基表進行范圍連接,以避免運算式謂詞,成功了:
WHERE search_dt
BETWEEN
DATE_ADD(
LAST_DAY(
DATE_ADD(entry_date,INTERVAL MONTH(entry_date)*-1 MONTH)
)
, INTERVAL 1 DAY
)
AND
LAST_DAY(
DATE_ADD(entry_date,INTERVAL 12-MONTH(entry_date) MONTH)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/363697.html
