4

下面是我的查询,我正在寻找只有子字符串值(将是 YYYY)小于当前年份的记录 - 25 年......我应该提到这个字段是 varchar 并且可能需要转换哪个我也未能成功。

SELECT 
            AccountNumber,
            LoanPrimeLongName,
            convert (varchar,LoanOpenDate,103)LoanOpenDate,
            LoanOriginalBalance,
            LoanBalance,
            LoanInterestRate,
            LoanRemainingTermMonths,
            LoanDelqDays,
            LoanDescription
FROM 
            ARCU.ARCULoanDetailed 
WHERE 
            (((LOANTYPE = '15'          OR
            LOANTYPE = '16'         OR
            LoanType = '17')            AND
            LoanStatus = 'Open')        AND
            ProcessDate = (CONVERT(VARCHAR, GETDATE(), 112)-1)) AND
            (SUBSTRING (loandescription,1,4) not like '%[^0-9]%')

ORDER BY AccountNumber
4

2 回答 2

3

由于我们不知道您使用的是哪个 RDBMS,因此我将采用最简单的答案。这假设您使用的是 MSSQL。

使用ISNUMERIC()函数来确定是否SUBSTRING(loandescription,1,4)实际上是一个数字。如果是,那么您可以在此时转换/转换它并将其与您感兴趣的“年份”进行比较。即:

        ...
        ProcessDate = (CONVERT(VARCHAR, GETDATE(), 112)-1)) AND
        (ISNUMERIC(SUBSTRING(loandescription,1,4)) = 1 AND 
        CAST(SUBSTRING(loandescription,1,4) AS INT) = (YEAR(GETDATE()) - 25))

由于布尔短路,如果前 4 个字符不是数字,那么它不会费心进行比较。相同的规则适用于其他 RDBMS 系统(例如 MySQL、PostgreSQL、SQLite 等),但方法可能有点不同。事实上,我认为 MySQL 或 PostgreSQL 都没有这个ISNUMERIC功能,这意味着你需要寻找其他方式(Regex)来测试。

于 2013-08-21T20:24:43.477 回答
1

假设您的 'YYYY' 字段是(SUBSTRING (loandescription,1,4) not like '%[^0-9]%')

AND CASE WHEN SUBSTRING (loandescription,1,4) not like '%[^0-9]%' 
            THEN CAST(SUBSTRING(loandescription,1,4)AS INT 
            ELSE YEAR(GETDATE()) 
     END < YEAR(DATEADD(year,-25,GETDATE()))

您需要该CASE语句,因为并不总是填充年份,并且文本值不会CAST作为INT. 然后你使用这个GETDATE()函数DATEADD()来添加你的 25 年标准。

于 2013-08-21T16:35:35.090 回答