Pregunta

El acceso

Estoy corriendo 2003. Estoy usando interruptor para seleccionar los campos de fecha en base a un criterio booleano:

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

es decir., Si el "criterio" es cierto, a continuación, volver Fecha1, de lo contrario volver Fecha2.

Fecha1 y Fecha2 son de fecha / columnas de tipo de horario en una mesa.

El problema es, interruptor de los devuelve como texto - No Fecha / Hora

¿Hay una manera de obligarlos a Fecha-dad? Probé

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

y

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

Ambos de los cuales fallar con un mensaje de error o de otra.

¿Alguna idea?

¿Fue útil?

Solución

Creo que el Si inmediata [IIf ()] es la función de una mejor coincidencia para lo que estamos tratando de hacer:

IIf(<criterion>, Date1, Date2)

Pero la función Switch () no debe romper los tipos de datos, y no es incompatible con los tipos de datos de fecha / hora. Considere esta función:

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 ( "hoy") Devuelve 10/6/2009 y TypeName (trySwitch ( "hoy")) Devuelve fecha

Otros consejos

Hay algo extraño con su ejemplo.

Interruptor acepta pares de expresión, y si el primero evalúa como VERDADERO, se devuelve su valor emparejado, de lo contrario, pasa a la segunda, y evalúa que el argumento.

Usted parece estar tratando 1 como verdadera, que es porque no es Fales, pero podría estar mejor con:

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

Pero eso es sólo una réplica de la funcionalidad de la función if inmediato, IIf (), y la función IIf () tarda menos argumentos.

Pero tiene el mismo problema, ya que devuelve una variante. Sin embargo, usted debe ser capaz de obligar a que a un tipo de datos que puede ser un formato de fecha.

Pero si o no que la variante será coaccionado implícita o tendrás que hacerlo de forma explícita, depende de dónde se esté usando. En un resultado de la consulta, puede ordenar la salida de IIf ([criterio], Fecha1, Fecha2) como una fecha, ya que la columna se forzar el tipo fecha.

Si usted tiene que hacer la coerción explícita, CDate () es la función de usar - que le envuelve la función externa que produce una salida de la variante con la función CDate () con el fin de tener la certeza de que la salida de variante es explícitamente coaccionado al tipo de fecha:

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

Pero podría muy bien estar perdiendo algo importante aquí, ya que aparecen fuera en una pista completamente diferente ...

Se puede publicar algo de código y datos para reproducir el problema, por favor? Como esto se SWITCH() en código SQL entonces creo SQL DDL (CREATE TABLE etc) y LMD (INSERT INTO añadir datos) serían los más apropiados:)

[punto Picky: El acceso de base de datos SQL no tiene un tipo de datos 'booleano'. Tiene un tipo de datos YESNO que puede ser el valor NULL; lógica de tres valor no es booleana.]

Aquí hay algo de SQL DML (Modo de consulta ANSI-92 sintaxis ) para demostrar cómo funciona como se esperaba para mí:

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

Cambie cualquiera de los valores de 'criterio' y el valor siempre se devuelve como 'Fecha' es decir, del tipo DATETIME.


ACTUALIZACIÓN:

  

Esta función es una gran TYPENAME   ... herramienta de acceso parece interpretar la   toda la "columna" del conjunto de resultados   diferente

En efecto. Debido a que una columna sólo puede ser un tipo de datos de los resultados de TYPENAME() en la fila puede ser engañosa. valores de las filas de los tipos mixtos deben ser 'promovidos' a un tipo de datos. Como es habitual en el motor de base de datos Access, el proceso es totalmente opaca y la documentación sobre el tema completamente ausente, por lo que sólo tiene que aguantar y ver, por ejemplo,

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

devuelve 'Fecha' y 'decimal', respectivamente, pero lo que será la columna? Al parecer, la respuesta es:

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;

'Cadena'?!

... que por supuesto no es ni siquiera una base de datos Access tipo de datos SQL del motor. Así TYPENAME(), molesto, utiliza el nombre de la 'mejor ajuste' Tipo de VBA. Por ejemplo:

SELECT TYPENAME(CBOOL(0));

retornos 'booleano' a pesar de que, como se mencionó anteriormente, no hay ningún tipo de datos Boolean en el acceso a SQL Database Engine. Y

SELECT TYPENAME(my_binary_col)

devuelve 'Cadena'. Nota la misma limitación de mapeo VBA se aplica a las funciones CAST (todavía otra molestia), por ejemplo, no hay ninguna función 'fundido a BINARY' y la función CDEC() permanece rota desde Jet 4.0: (

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top