我无法让日期列尊重 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|
答案 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 交谈。
答案 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。