使用to_char // to_timestamp时出错

时间:2010-05-23 07:48:10

标签: database postgresql

我在PostgreSQL中有一个数据库,我正在使用这个数据库在PHP中开发一个应用程序。 问题是,当我执行以下查询时,我在phpPgAdmin中得到了一个很好的结果,但是在我的PHP应用程序中我得到了一个错误。

查询:

SELECT t.t_name, t.t_firstname
   FROM teachers AS t
   WHERE t.id_teacher IN    ( 
      SELECT id_teacher FROM teacher_course AS tcourse
          JOIN course_timetable AS coursetime
          ON tcourse.course = coursetime.course
          AND to_char(to_timestamp('2010-4-12', 'YYYY-MM-DD'),'FMD') = (coursetime.day +1)
      )
   AND t.id_teacher NOT IN (
      SELECT id_teacher FROM teachers_fill WHERE date = '2010-4-12'
   )
ORDER BY t.t_name ASC

这是PHP中的错误

operator does not exist: text = integer (to_timestamp('', 'YYYY-MM-DD'),'FMD') =
 (courset... ^ HINT: No operator matches the given name and argument type(s). 
You might need to add explicit type casts.

解决此错误的目的是在php中使用ORIGINAL查询:

  

$ date =“2010”。“ - ”。$ selected_month。“ - ”。$ selected_day;

SELECT ...
  AND to_char(to_timestamp('$date', 'YYYY-MM-DD'),'FMD') = (coursetime.day +1)
)
AND t.id_teacher NOT IN (
      SELECT id_teacher FROM teachers_fill WHERE date = '$date'
)

1 个答案:

答案 0 :(得分:1)

错误消息对我来说非常清楚。你正在混合字符串和数字。更确切地说,您将字符串('2010-4-12')转换为时间戳,然后转换为字符串,然后与int进行比较。这是一个类型混乱,postgresql对打字非常严格(出于好的理由)。你想在这做什么?

to_char(to_timestamp('2010-4-12', 'YYYY-MM-DD'),'FMD') = (coursetime.day +1))

此外,你应该使用TIMESTAMP,只需要一个日期。

如果(我不确定)您要比较从格式为'YYYY-MM-DD'的日期到给定值(作为整数)的星期几,您应该更好地使用date_part。例如(未测试):

date_part('dow' , to_date('2010-4-12', 'YYYY-MM-DD') ) = coursetime.day + 1