2011-04-09 11 views
22

estoy consiguiendo el errorBIGINT valor sin signo está fuera del rango

BIGINT valor sin signo está fuera de rango en '(1301980250-mydbnews_articlesdate..)'

Cuando ejecuto el consulta

SELECT *, ((1/log(1301980250 - date)) * 175) as weight FROM news_articles ORDER BY weight; 

Al eliminar la condición ORDER BY, también se elimina el error. ¿Cómo puedo arreglarlo?

Actualización: El campo de fecha contiene la marca de tiempo de unix (por ejemplo, 1298944082). El error comenzó a aparecer después de actualizar MySQL de 5.0.x a 5.5.x

¿Alguna ayuda, por favor?

+0

Danos un ejemplo de los datos guardados en la fecha, sospecho que tiene algo que ver con eso. – Khez

+1

Supongo que Khez tiene razón y el problema es un valor de fecha que es mayor que 1301980250. –

+0

Todavía dudo que pueda conducir a ese error específico, pero sigue siendo un punto comenzar a replicar el error. – Khez

Respuesta

52

Hace poco me encontré en esto y encontró la solución más razonable para simplemente lanzar cualquier entrada SIN FIRMAR como FIRMADA.

SELECT *, ((1/log(1301980250 - cast(date as signed)) * 175) as weight FROM news_articles ORDER BY weight 
+0

Extraño, pero funcionó. – TranslucentCloud

4

Cualquier valor de fecha después de 2011-04-04 22:10:50 PDT (2011-04-05 05:10:50 utc) causará este error ya que eso haría que la expresión sea negativa.

14

El problema fue causado por un desbordamiento de entero sin signo, como lo sugirió wallyk. Puede ser resuelto por

  1. usando SELECT *, ((1/log((date - 1301980250) * -1)) * 175) as weight FROM news_articles ORDER BY weight; (Éste trabajó para mí) `
  2. Cambio de parámetros sql_mode en my.cnf a NO_UNSIGNED_SUBTRACTION (no se han comprobado esto)
+13

@wallyk - Contestar a mi propia pregunta no me da ningún punto, así que no lo hice para mejorar mi reputación. Encontré la respuesta en MySQL IRC. Aprecio tu tiempo y esfuerzo y he votado a favor tu respuesta. Pero no proporcionó la solución al problema y quería compartirlo aquí. –

+5

Si no puede o no quiere modificar el archivo de configuración. También se puede utilizar la siguiente declaración: 'set sql_mode = 'NO_UNSIGNED_SUBTRACTION';' –

+1

@wallyk y cualquier otra persona que lee esto ahora - esto simplemente no es cierto. Puede responder su propia pregunta al momento de formularla. Stackoverflow quiere buenas preguntas con respuestas bien documentadas, no importa quién las proporcione. – Luke

1

tal vez se puede utilizar cast

SELECT *, ((1/log(1301980250 - cast(date AS SIGNED))) * 175) as weight FROM news_articles ORDER BY weight;

1

Esto a veces puede ser causada por los nulos en los datos.

Uso IFNULL para establecer un valor por defecto (probablemente 0 para una marca de tiempo es una mala forma predeterminada y, de hecho, en este caso podría ser mejor excluyente y fechas nulas en la cláusula WHERE)

SELECT (123456 - IFNULL(date, 0)) AS leVar

+0

En mi caso, estaba haciendo un value = value-1000 en un valor 0, en una columna int sin firmar. –

0

Nadie Mencionó que la función log() solo está definida para argumentos estrictamente positivos. Esté atento a esto cuando use sustracciones dentro de log().

En cuanto a la pregunta original, un factor clave para la resolución fue decirnos el tipo de datos para la columna de fecha. Si no está registrado, a MySQL podría no gustarle.

Cuestiones relacionadas