Umwandlung in datetime scheitert nur auf die WHERE-Klausel?

Ich habe ein problem mit einigen SQL-server Abfragen. Stellt sich heraus, dass ich eine Tabelle mit "Attibute_Name" und "Attibute_Value" Felder, die beliebigen Typs sein können, gespeichert in varchar. (Ja... ich weiß.)

Alle Termine für ein bestimmtes Attribut zu sein scheinen gespeichert, die die "YYYY-MM-DD hh:mm:ss" format (nicht 100% sicher, es gibt Millionen von Einträgen hier), so kann ich diesen code ausführen, ohne Probleme:

select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from 
    ProductAttributes pa
    inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where 
    a.Attribute_Name = 'SomeDate'

Allerdings, wenn ich führen Sie den folgenden code:

select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from 
    ProductAttributes pa
    inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where 
    a.Attribute_Name = 'SomeDate'
    and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()

Ich die folgende Fehlermeldung erhalten:
Fehler bei der Konvertierung beim konvertieren von Datum und/oder Zeit von-Zeichenfolge.

Wie kommt es scheitert an der where-Klausel und nicht auf die wählen Sie eine?

Weiteren Hinweis:

Wenn statt der Filterung durch die Attribute_Name ich mit der eigentlichen Attribute_ID in der Datenbank gespeichert (PK) es funktioniert ohne problem.

select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from 
    ProductAttributes pa
    inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where 
    a.Attribute_ID = 15
    and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()

Update
Danke an alle für die Antworten. Ich fand es schwer, um tatsächlich wählen Sie eine richtige Antwort, weil jeder darauf hingewiesen, etwas, das nützlich für das Verständnis, die Frage. Es war auf jeden Fall mit, um mit der Reihenfolge der Ausführung.
Stellt sich heraus, dass meine erste Abfrage korrekt funktionierte, weil die WHERE-Klausel war zuerst ausgeführt, dann die WÄHLEN Sie.
Meine zweite Abfrage ist fehlgeschlagen, weil der Grund derselben (wie die Attribute wurden nicht gefiltert, die Konvertierung ist fehlgeschlagen, während der Ausführung der gleichen WHERE-Klausel).
Meine Dritte Abfrage funktioniert, weil die ID war Teil der index (PK), so dass es den Vorrang hatten und es aufgerissen Ergebnisse auf, dass die Bedingung zuerst.

Dank!

  • gibt es ein weiteres Attribut, genannt sOmeDaTe - falls Sie eine case insensitive Sortierung? Wahrscheinlich seine vermasselt Ihr verbindet.
  • Du scheinst vorausgesetzt werden, irgendeine Art von Kurzschluss-Auswertung oder garantierte Reihenfolge der Prädikate in der WHERE - Klausel. Ist dies nicht gewährleistet. Wenn Sie über gemischte Datentypen in einer Spalte, so ist die einzige sichere Umgang Sie ist mit einem CASE Ausdruck.
  • Was für ein Tisch ist PHA? Wenn ein PHA ist, eine andere Tabelle als die PA, dann scheint es, dass PHA Daten hat einige unconvertable records, wo, wie PA ' s nicht.
  • Ich weiß, warum du bist nicht 100% sicher - wenn Sie einen VARCHAR Spalte zum speichern von Datum/Zeit-Werte, jedem steht es frei, zu speichern, alten Kram gibt, dass Sie wollen. Für die EAV habe ich immer bevorzugt die Trennung von dieser aus in die richtigen Spalten für mindestens die drei Basis-Typen, ein string-Attribut, die ein Datum/Uhrzeit-Attribut und einem numerischen Attribut. Es ist nicht perfekt und ist es nicht eine free-trade-off, aber Sie haben eine viel bessere Aufnahme zu gewährleisten, ungültige Daten immer aus der Datenbank.
  • Gerade überprüft, die Spalte Sortierung SQL_Latin1_General_CP1_CI_AS also ich denke, es würde der Fall sein, aber ich fand keine anderen anders-cased Wert. Gut Schießen!
  • Smith, Nicht wirklich, ich bin eigentlich abstrahieren mich aus diesem Standpunkt, so würde ich erwarten, dass es funktioniert oder nicht, egal wo die Vergleiche gemacht werden. Das ist, was motiviert meine Frage.
  • Sorry. Ich bin absichtlich verschleiert die Reale Struktur der DB hat zwei Gründe: 1. halten Sie es einfach, um zu zeigen, das problem ich habe 2. vertrauliche Informationen nicht offenlegen, dass ich rechtlich nicht erlaubt. Ich schon fest, dass in den Abfragen vor.
  • Bertrand ich Stimme zu, und ich weiß, dass es einige nicht-Datums-Werte in dieser Spalte, aber ich bin einrichten der Filter, was soll nur datetime (und die Tatsache, dass eine der Abfragen nicht zu Versagen sollten bestätigen, dass Sie alle korrekt konvertiert datetime). Dies ist nicht so beschissen wie die Werte kommen aus einem automatischen system, so kann ich erwarten, dass Sie, um gültig zu sein... aber ich bin mir des Risikos bewusst.
  • Nicht sicher, warum Sie sagen, Sie sind abstrahiert aus, dass POV. Attribute_Value enthält nicht die Termine, die Sie Gießen Sie die Spalte ein Datum. Sie müssen glauben, daß eine form der vorab-Filterung ist gewährleistet.
  • Smith, den ich gerade gelesen Remus' Artikel, und ich endlich verstanden, was Sie sagte. Du hast Recht, es macht Total Sinn.

InformationsquelleAutor Alpha | 2011-08-31
Schreibe einen Kommentar