Frage

Ich bin mit Access 2003. Ich bin mit Schalter Felder auszuwählen Datum basiert auf einem boolean Kriterium:

Switch(<criterion>, Date1, 1, Date2)

d., Wenn "Kriterium" wahr ist, dann Date1 zurückkehren, sonst Date2 zurückzukehren.

Date1 und Date2 sind Datum / Zeit-Typ-Spalten in einer Tabelle.

Das Problem ist, Switch kehrt sie als Text - nicht Datum / Uhrzeit

Gibt es eine Möglichkeit, sie in Datum-ness zu zwingen? Ich habe versucht,

Switch(<criterion>, #Date1#, 1, #Date2#)

Und

Switch(<criterion>, Val(Date1), 1, Val(Date2))

Beide, die nicht mit einer Fehlermeldung oder einem anderen.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich denke, die Immediate If [IIf ()] Funktion ist eine bessere Übereinstimmung für das, was Sie zu tun versuchen:

IIf(<criterion>, Date1, Date2)

Aber die Switch () Funktion sollte nicht Datentypen brechen, und ist mit Datum / Uhrzeit-Datentypen nicht unvereinbar. Betrachten Sie diese Funktion:

Public Function trySwitch(ByVal pWhichDay As String) As Variant
    Dim varOut As Variant
    varOut = Switch(pWhichDay = "yesterday", Date - 1, _
        pWhichDay = "today", Date, _
        pWhichDay = "tomorrow", Date + 1)
    trySwitch = varOut
End Function

trySwitch ( "heute") Rückkehr 2009.10.06 und Type-Name (trySwitch ( "heute")) Rückkehr Datum

Andere Tipps

Es ist etwas seltsam mit Ihrem Beispiel.

Schalter akzeptiert Ausdruckspaare, und, wenn die ersten auswertet als wahr, ihr gepaarter Wert zurückgegeben, andernfalls leitet an den zweiten und auswertet, das Argument.

Sie scheinen 1 als wahr zu sein Behandlung, die es ist, weil es nicht Fales ist, aber Sie wären besser dran mit:

  Switch(<criterion>, Date1, True, Date2)

Aber das ist nur eine Replikation der Funktionalität der Immediate If-Funktion IIf () und IIf () nimmt weniger Argumente.

Aber es hat das gleiche Problem, dass es eine Variante zurückgibt. Aber Sie sollten auf einen Datentyp zu zwingen können, dass die als ein Datum formatiert werden können.

Aber ob diese Variante implizit dazu gezwungen werden, oder werden Sie es explizit tun müssen, hängt davon ab, wo Sie es verwenden. In einem Abfrageergebnis, können Sie die Ausgabe von IIf ([Kriterium], Date1, Date2) als Datum sortieren, weil die Spalte Datum Typ umgewandelt wird.

Wenn Sie den Zwang explizit zu tun haben, CDate () ist die Funktion zu verwenden - Sie die Außen Funktion wickeln würden, die Variant-Ausgabe mit der CDate () Funktion, um sicher zu sein, erzeugt, dass die Variante explizit ausgegeben ist dazu gezwungen bisher Typ:

  CDate(IIf(<criterion>, Date1, Date2))

Aber ich könnte sehr wohl etwas Wichtiges hier fehlt, wie ich auf einem ganz anderen Weg sein off erscheinen ...

Können Sie einige Codes und Daten veröffentlichen, das Problem zu reproduzieren, bitte? Da diese SWITCH() in SQL-Code ist dann denke ich, SQL DDL (CREATE TABLE etc.) und DML (INSERT INTO Daten hinzufügen) wäre am besten geeignet:)

[Picky Punkt: Access-Datenbank SQL keinen 'boolean' Datentyp. Es hat einen YESNO Datentyp, der der NULL Wert sein kann; Drei-Wert-Logik ist nicht Boolean.]

Hier einige SQL DML ( ANSI-92-Abfragemodus Syntax ) zu zeigen, wie es funktioniert für mich wie erwartet:

SELECT TYPENAME
       (
          SWITCH
          (
             NULL, #2009-01-01 00:00:00#, 
             FALSE, #2009-06-15 12:00:00#, 
             TRUE, #2009-12-31 23:59:59#
          )
       );

Ändern Sie die ‚Kriterium‘ Werte und der Wert wird immer wieder als ‚Datum‘ das heißt vom Typ DATETIME.


UPDATE:

  

Das TYPENAME Funktion ist eine große   Werkzeug ... Zugang scheint das zu interpretieren   gesamte „Spalte“ des resultset   anders

der Tat. Da eine Spalte nur eine sein kann Daten geben die Ergebnisse der TYPENAME() an der Reihe kann irreführend sein. Zeilenwerte von Mischtypen müssen ‚befördert‘ zu einem höheren Datentyp. Wie üblich mit dem Access-Datenbank-Engine ist, ist der Prozess völlig undurchsichtig und die Dokumentation über das Thema völlig fehlen, so dass Sie nur saugen müssen und sehen z.B.

SELECT #2009-01-01 00:00:00# AS row_value, 
       TYPENAME(#2009-01-01 00:00:00#) AS row_type
  FROM Customers
UNION ALL
SELECT 0.5, 
       TYPENAME(0.5) AS row_type
  FROM Customers

Gibt ‚Date‘ und ‚Dezimal‘ bzw., aber wie wird die Säule sein? Offenbar ist die Antwort:

SELECT DT1.row_value, TYPENAME(DT1.row_value) AS column_type
  FROM (
        SELECT DISTINCT #2009-01-01 00:00:00# AS row_value 
          FROM Customers
        UNION ALL
        SELECT DISTINCT 0.5
          FROM Customers
       ) AS DT1;

'String'?!

... natürlich das ist nicht einmal ein Access-Datenbank-Engine SQL-Datentyp. So TYPENAME() verwendet annoyingly, den Namen des 'Best-Fit' VBA-Typ. Zum Beispiel:

SELECT TYPENAME(CBOOL(0));

Gibt ‚Boolean‘ obwohl, wie oben beschrieben, gibt es keinen Boolesche Datentyp in Access-Datenbank-Engine SQL. Und

SELECT TYPENAME(my_binary_col)

Gibt 'String'. Beachten Sie die gleiche VBA Mapping Einschränkung gilt für die CAST Funktionen (noch anderes Ärgernis) z.B. gibt es keine, da Jet gebrochen ‚cast BINARY‘ Funktion und die CDEC() Funktion bleibt 4,0: (

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top