Where 子句中的 Oracle 日期问题

时间:2021-04-10 15:48:34

标签: oracle plsql toad-data-point

我无法让日期列尊重 where 子句。无论我做什么,它都不会按日期过滤。我已经尝试了 to_char 和 to_date 的所有组合都徒劳无功。

HAVING TO_CHAR(PAYMASTR.CHECK_DATE,'MM/DD/YYYY') > '01/01/2021'

我还尝试了下面的代码,其中包含 to_char 和 to_date 的所有组合。

HAVING PAYMASTR.CHECK_DATE >= TO_DATE('01-01-2021 12:00:00 AM',
  'MM-DD-YYYY HH:MM:SS AM')

DATE 类型的 check_date。

结果集:

|COMPANY|EMPLOYEE|PAY_SUM_GRP|PAY_GRADE RATE|WAGE_AMOUNT|NET_PAY_AMT|GROSS_PAY|CHECK_DATE|
|-------|--------|-----------|--------------|-----------|-----------|---------|----------|
|2|5|REG    09|21.98|175.84|1459.96|2263.19|1/19/2007 12:00:00 AM|
|2|5|REG    09|21.98|175.84|1663.93|2589.43|1/5/2007 12:00:00 AM|

3 个答案:

答案 0 :(得分:0)

如果 CHECK_DATE 列的数据类型是 DATE(应该是!如果是 VARCHAR2,那么你做错了!),那么

having check_date > date '2021-01-01'

即比较日期和日期文字。


您发布的第二个代码几乎没问题:

HAVING PAYMASTR.CHECK_DATE >= TO_DATE('01-01-2021 12:00:00 AM', 'MM-DD-YYYY HH:MI:SS AM')
                                                                               --
                                                        MI for minutes; MM is for month

答案 1 :(得分:0)

我发现这篇关于代码项目的文章对我有用。我真的很难让查询尊重 queru 中的日期参数。将会话设置为 NLS_DATE_FORMAT 有效。不确定它可能有什么其他影响。将不得不与 DBA 交谈。

Code Project

答案 2 :(得分:0)

这完全是关于 Oracle 如何存储和使用日期 DATATYPE 日期有七个组成部分 世纪、年、月、日、时、分、秒 所有这些组件都占用七个字节的存储空间。 每当您从表中提取日期列时,日期值都会以更易读的形式进行格式化,并且此格式在 nls_date_format 参数中设置。

我假设您按 CHECK_DATE 分组,否则您需要使用 WHERE 子句添加此日期过滤器。

所以首先检查你的列 CHECK_DATE 的数据类型 如果是日期则

HAVING CHECK_DATE >= TO_DATE('01-01-2021', 'MM-DD-YYYY')

如果省略的小时四舍五入到 12 AM 或 00(如果使用 24 小时格式),则您不必提供小时、分钟和秒; 或者,如果您也想拥有数小时,那么您可以使用 MM 而不是 MI 来表示分钟。

HAVING CHECK_DATE >= TO_DATE('01-01-2021 00:00:00', 'MM-DD-YYYY HH24:MI:SS')

这没有意义

HAVING TO_CHAR(PAYMASTR.CHECK_DATE,'MM/DD/YYYY') > '01/01/2021'

您想比较日期而不是字符,to_char 将为您提供一个字符串,该字符串与另一个字符串 '01/01/2021' 没有任何比较的意义。

因此,如果您没有使用 WHERE 子句按 CHECK_DATE 用户过滤条件分组 或检查 CHECK_DATE 的数据类型,如果不是 DATE,则将其更改为 DATE。

相关问题