我是SQL的初学者,但遇到使我的查询无法正常工作的问题。我需要做的就是在下面的查询中添加一个日期范围过滤器。我正在按字段f.date_value进行过滤。参数2和参数3将是员工运行报表时选择的日期。该SQL报告运行在我们的一种软件中的内置SQL工具中,因此与我们用来访问数据库的SQL Developer略有不同。有人对我在以下查询中需要更改的内容有任何想法吗?非常感谢你!
SELECT st.dcid,
st.student_number,
st.lastfirst,
st.grade_level,
to_char(f.date_value,'MM/DD/YYYY'),
f.fee_type_name,
f.description,
f.fee_amount,
f.fee_paid,
f.fee_balance
FROM PS.FEE f
LEFT OUTER JOIN STUDENTS ST
ON f.StudentID = st.ID
WHERE (f.SCHOOLID=%param1%) AND (st.ENROLL_STATUS=0) AND (f.date_value BETWEEN %parm2% AND %parm3%)
ORDER BY st.LASTFIRST
答案 0 :(得分:0)
除了可能to_date
的使用以及确切的使用方式取决于参数的数据类型和格式之外,没有什么可提供的。我以为它们是字符串,但不知道它们提供的格式(我在下面使用了yyyy-mm-dd)。
SELECT
st.dcid
, st.student_number
, st.lastfirst
, st.grade_level
, to_char(f.date_value, 'MM/DD/YYYY')
, f.fee_type_name
, f.description
, f.fee_amount
, f.fee_paid
, f.fee_balance
FROM PS.FEE f
LEFT OUTER JOIN STUDENTS st ON f.StudentID = st.ID
WHERE f.SCHOOLID = %param1%
AND st.ENROLL_STATUS = 0
AND f.date_value BETWEEN to_date(%parm2%,'yyyy-mm-dd') AND to_date(%parm3%,'yyyy-mm-dd')
ORDER BY
st.LASTFIRST
要注意的唯一另一件事是between
通常是定义日期范围的一种较差的方法-但这部分取决于数据的时间精度。如果您的数据仅到当天才是准确的,那么上面看到的between
就可以了。如果精度较低(例如,秒或更低),请不要使用,而是:
AND f.date_value >= to_date(%parm2%,'yyyy-mm-dd')
AND f.date_value < to_date(%parm3%,'yyyy-mm-dd') + 1