por operaciones mes funciones funcion fechas fecha entre definicion consulta con año date ms-access

date - operaciones - Aplicar una operación a un campo de datos con criterios de fecha irregulares



funciones de fecha en access (4)

Esta es una pregunta muy novedosa sobre MS Access. Entonces soy novato y no estoy seguro de cómo hacer una pregunta correcta sobre MS Access. Así que por favor perdona cualquier transgresión.

Supongamos que tengo una base de datos que incluye los siguientes campos:

  • Grupo (campo de texto, dos niveles A y B)
  • Fecha (campo de fecha; enero de 2012 a diciembre de 2014)
  • Año (definido como Año: Año ([Fecha]))
  • Altura (campo numérico, centímetro)

Ahora la altura es una medida en centímetros. Digamos que algo salió mal con nuestras medidas de altura y para algunas fechas y grupos, en vez de cm, se ingresaron pulgadas en la base de datos. Digamos que hay demasiados valores para prácticamente cambiarlos dentro de la base de datos. Entonces necesito aplicar esto usando la herramienta MS Access. Para simplificar, digamos que al dividir un valor de una pulgada por 0.4 convertiremos las unidades a centímetros.

Las alturas se ingresaron incorrectamente para el Grupo A durante 2012 y 2013, excepto el 4 de octubre de 2013 y el 5 de octubre de 2013, donde se ingresaron correctamente.

Entonces la pregunta es, ¿cómo puedo (y pensé usar el campo de criterios en la vista de diseño de una consulta) convertir las alturas de pulgadas a centímetros usando los criterios de fecha especificados anteriormente (incluidas las excepciones de octubre)?

Incluso señalarme en la dirección correcta sería muy útil. Estoy acostumbrado a diferentes lenguajes de programación y esto me tiene perplejo por dónde empezar.

Actualización En mi prisa por desarrollar un ejemplo simple omití que estaba tratando de agregar esta funcionalidad a una consulta existente. La respuesta de @winghei es probablemente perfecta. Sin embargo, no está claro dónde agregarlo a mi código sql en mi consulta. Aquí está el código que ya existe:

SELECT LAKE.NAME_TXT AS [Group], TRAWL_TRIP.TRAWL_TRIP_DAT AS Trawl_Date, Year([TRAWL_TRIP_DAT]) AS [Year], SAMPLE.WEIGHT_NUM AS Height FROM (((LAKE INNER JOIN STATION ON LAKE.LAKE_ID = STATION.LAKE_ID) INNER JOIN (NET_TYPE RIGHT JOIN (TRAWL_TYPE RIGHT JOIN TRAWL_TRIP ON TRAWL_TYPE.TRAWL_TYPE_ID = TRAWL_TRIP.TRAWL_TYPE_ID) ON NET_TYPE.NET_TYPE_ID = TRAWL_TRIP.NET_TYPE_ID) ON STATION.STATION_ID = TRAWL_TRIP.STATION_ID) INNER JOIN TRAWL ON TRAWL_TRIP.TRAWL_TRIP_ID = TRAWL.TRAWL_TRIP_ID) INNER JOIN (MATURITY_TYPE RIGHT JOIN (SPECIES_TYPE INNER JOIN SAMPLE ON SPECIES_TYPE.SPECIES_TYPE_ID = SAMPLE.SPECIES_TYPE_ID) ON MATURITY_TYPE.MATURITY_TYPE_ID = SAMPLE.MATURITY_TYPE_ID) ON TRAWL.TRAWL_ID = SAMPLE.TRAWL_ID WHERE (((TRAWL_TRIP.TRAWL_TRIP_DAT)>=Nz([Forms]![frmReport]![txtTrawlDateFrom],[TRAWL_TRIP_DAT]) And (TRAWL_TRIP.TRAWL_TRIP_DAT)<=Nz([Forms]![frmReport]![txtTrawlDateTo],[TRAWL_TRIP_DAT])));

Entonces, ahora la pregunta es, ¿dónde agrego el código de @winghei?

ACTUALIZACIÓN 2 Por lo tanto, aún no puedo agregar esta consulta en.

SELECT LAKE.NAME_TXT AS [Group], TRAWL_TRIP.TRAWL_TRIP_DAT AS Trawl_Date, Year([TRAWL_TRIP_DAT]) AS [Year], SAMPLE.WEIGHT_NUM AS Height FROM (((LAKE INNER JOIN STATION ON LAKE.LAKE_ID = STATION.LAKE_ID) INNER JOIN (NET_TYPE RIGHT JOIN (TRAWL_TYPE RIGHT JOIN TRAWL_TRIP ON TRAWL_TYPE.TRAWL_TYPE_ID = TRAWL_TRIP.TRAWL_TYPE_ID) ON NET_TYPE.NET_TYPE_ID = TRAWL_TRIP.NET_TYPE_ID) ON STATION.STATION_ID = TRAWL_TRIP.STATION_ID) INNER JOIN TRAWL ON TRAWL_TRIP.TRAWL_TRIP_ID = TRAWL.TRAWL_TRIP_ID) INNER JOIN (MATURITY_TYPE RIGHT JOIN (SPECIES_TYPE INNER JOIN SAMPLE ON SPECIES_TYPE.SPECIES_TYPE_ID = SAMPLE.SPECIES_TYPE_ID) ON MATURITY_TYPE.MATURITY_TYPE_ID = SAMPLE.MATURITY_TYPE_ID) ON TRAWL.TRAWL_ID = SAMPLE.TRAWL_ID WHERE (((TRAWL_TRIP.TRAWL_TRIP_DAT)>=Nz([Forms]![frmReport]![txtTrawlDateFrom],[TRAWL_TRIP_DAT]) And (TRAWL_TRIP.TRAWL_TRIP_DAT)<=Nz([Forms]![frmReport]![txtTrawlDateTo],[TRAWL_TRIP_DAT]))); UPDATE(SELECT LAKE.NAME_TXT AS [Group], TRAWL_TRIP.TRAWL_TRIP_DAT AS Trawl_Date, Year([TRAWL_TRIP_DAT]) AS [Year], SAMPLE.WEIGHT_NUM AS Height FROM (((LAKE INNER JOIN STATION ON LAKE.LAKE_ID = STATION.LAKE_ID) INNER JOIN (NET_TYPE RIGHT JOIN (TRAWL_TYPE RIGHT JOIN TRAWL_TRIP ON TRAWL_TYPE.TRAWL_TYPE_ID = TRAWL_TRIP.TRAWL_TYPE_ID) ON NET_TYPE.NET_TYPE_ID = TRAWL_TRIP.NET_TYPE_ID) ON STATION.STATION_ID = TRAWL_TRIP.STATION_ID) INNER JOIN TRAWL ON TRAWL_TRIP.TRAWL_TRIP_ID = TRAWL.TRAWL_TRIP_ID) INNER JOIN (MATURITY_TYPE RIGHT JOIN (SPECIES_TYPE INNER JOIN SAMPLE ON SPECIES_TYPE.SPECIES_TYPE_ID = SAMPLE.SPECIES_TYPE_ID) ON MATURITY_TYPE.MATURITY_TYPE_ID = SAMPLE.MATURITY_TYPE_ID) ON TRAWL.TRAWL_ID = SAMPLE.TRAWL_ID WHERE (((TRAWL_TRIP.TRAWL_TRIP_DAT)>=Nz([Forms]![frmReport]![txtTrawlDateFrom],[TRAWL_TRIP_DAT]) And (TRAWL_TRIP.TRAWL_TRIP_DAT)<=Nz([Forms]![frmReport]![txtTrawlDateTo],[TRAWL_TRIP_DAT])));) SET `Heightcm`=`Height`/.4 WHERE `Trawl_Date` <> #10/4/2013# AND `Trawl_Date` <> #10/5/2013# AND `GROUP` = "A" AND Year(`Trawl_Date`) = 2012 AND Year(`Trawl_Date`) = 2013

Esto produce este error:

Caracteres encontrados después del final de la instrucción SQL

Entonces nombré la consulta anterior Temp_Query , la Temp_Query y luego intenté esto:

UPDATE(Temp_Query) SET `Heightcm`=`Height`/.4 WHERE `Trawl_Date` <> #10/4/2013# AND `Trawl_Date` <> #10/5/2013# AND `GROUP` = "A" AND Year(`Trawl_Date`) = 2012 AND Year(`Trawl_Date`) = 2013

Esto procesado. Sin embargo, al observar este intento en la vista de la hoja de datos, solo se genera una columna Heightcm mientras que lo que me gustaría hacer es agregar la columna modificada a los datos completos como una columna.

Alguna idea aqui?

Actualización 3 Publicada una definición de tabla (MUESTRA) a petición de @krish KM

Table: SAMPLE Page: 1 Properties AlternateBackShade: 100 AlternateBackThemeC -1 AlternateBackTint: 100 BackShade: 100 BackTint: 100 DatasheetForeTheme -1 DatasheetGridlinesTh -1 DateCreated: 2013-02-27 8:14:59 PM DefaultView: 2 DisplayViewsOnShare 1 FilterOnLoad: False GUID: {guid {9ADCA5B5- DCFF-49DB-BBC2- HideNewField: False LastUpdated: 2016-10-12 9:39:47 AM NameMap: Long binary data OrderByOn: False OrderByOnLoad: True Orientation: Left-to-Right PublishToWeb: 1 ReadOnlyWhenDiscon False RecordCount: 55907 ThemeFontIndex: -1 TotalsRow: False Updatable: True


Para ver los resultados del cálculo, intente:

SELECT LAKE.NAME_TXT AS [GROUP], TRAWL_TRIP.TRAWL_TRIP_DAT AS Trawl_Date, YEAR([TRAWL_TRIP_DAT]) AS [YEAR], SAMPLE.WEIGHT_NUM AS HeightIN, SAMPLE.WEIGHT_NUM / 0.4 AS HeightCM, FROM ((LAKE INNER JOIN STATION ON LAKE.LAKE_ID = STATION.LAKE_ID INNER JOIN (NET_TYPE RIGHT JOIN (TRAWL_TYPE RIGHT JOIN TRAWL_TRIP ON TRAWL_TYPE.TRAWL_TYPE_ID = TRAWL_TRIP.TRAWL_TYPE_ID) ON NET_TYPE.NET_TYPE_ID = TRAWL_TRIP.NET_TYPE_ID) ON STATION.STATION_ID = TRAWL_TRIP.STATION_ID) INNER JOIN TRAWL ON TRAWL_TRIP.TRAWL_TRIP_ID = TRAWL.TRAWL_TRIP_ID) INNER JOIN (MATURITY_TYPE RIGHT JOIN (SPECIES_TYPE INNER JOIN SAMPLE ON SPECIES_TYPE.SPECIES_TYPE_ID = SAMPLE.SPECIES_TYPE_ID) ON MATURITY_TYPE.MATURITY_TYPE_ID = SAMPLE.MATURITY_TYPE_ID) ON TRAWL.TRAWL_ID = SAMPLE.TRAWL_ID WHERE (((TRAWL_TRIP.TRAWL_TRIP_DAT)>= Nz([Forms]![frmReport]![txtTrawlDateFrom], [TRAWL_TRIP_DAT]) AND (TRAWL_TRIP.TRAWL_TRIP_DAT)<= Nz([Forms]![frmReport]![txtTrawlDateTo], [TRAWL_TRIP_DAT]))) and TRAWL_TRIP.TRAWL_TRIP_DAT <> #10/4/2013# AND TRAWL_TRIP.TRAWL_TRIP_DAT <> #10/5/2013# AND LAKE.NAME_TXT = "A" AND (Year(TRAWL_TRIP.TRAWL_TRIP_DAT) = 2012 or Year(TRAWL_TRIP.TRAWL_TRIP_DAT) = 2013)

Sin embargo, no estoy seguro de que desee actualizar el valor, es posible que desee almacenar el valor actualizado en otra columna en caso de que algo salga mal.

Para actualizar el valor, cree una consulta de actualización basada en la consulta anterior y actualice HeightIN al valor HeightCM. Sin embargo, podría darle un error, diciendo que el conjunto de registros no es actualizable. Si ese es el caso, necesitará el PK de su tabla SAMPLE (SPECIES_TYPE_id?) Y el nuevo valor que desee. Puede poner eso en una nueva tabla y luego unirlo con SAMPLE y podrá hacer su actualización.

HTH

su criterio de fecha va al final de la cláusula WHERE y no necesita una consulta de UPDATE separado si tiene confianza en los resultados, es mejor ver los resultados antes de la actualización, en caso de que los resultados no sean los que usted esperado.

Para su consulta de actualización, si está satisfecho con los resultados de SELECT , intente

update UpdateSampleData set HeightIN = HeightCM

pero no me sorprendería si dijera ''recordset not updateable''

Dado que su conjunto de registros no es actualizable, deberá cambiar su consulta SELECT por una consulta MAKE TABLE , que colocará los resultados en una nueva tabla. Sin embargo, asegúrese de agregar los campos de la clave principal de SAMPLE . Entonces debería poder actualizar SAMPLE con el valor relacionado de su nueva tabla. O, mejor aún, agregue un nuevo campo a su tabla SAMPLE primero para el nuevo valor, luego actualice el nuevo campo en lugar de sobrescribir el valor existente.


Suponiendo que tiene los siguientes criterios: DATE <> 10/4/2013 , DATE <> 10/5/2013, GROUP = "A", Year(Date) = 2012, Year(Date) = 2013 y desea actualizar la Height a centímetro por Height/.4 entonces tendrá que usar la consulta:

UPDATE [table_name] SET `Height`=`Height`/.4 WHERE `DATE` <> #10/4/2013# AND `DATE` <> #10/5/2013# AND `GROUP` = "A" AND Year(`Date`) = 2012 AND Year(`Date`) = 2013

En MS Access, vaya a Create -> Query Design . Luego En la Result->SQL View superior izquierda, haga clic en Result->SQL View . Finalmente, pegue el patrón sql desde arriba y luego cambie Result->Design View . Supongo que desde aquí tendrás una idea sobre cómo usar la vista de diseño de SQL en Access. Nota: Tenga cuidado al usar nombres de reserva como Date .

Actualización: a partir de la consulta anterior, puede tenerla como subconsulta.

UPDATE (paste_the_query_above_here) SET `Height`=`Height`/.4 WHERE `Trawl_Date` <> #10/4/2013# AND `Trawl_Date` <> #10/5/2013# AND `GROUP` = "A" AND Year(`Trawl_Date`) = 2012 AND Year(`Trawl_Date`) = 2013

Actualización 2: como seleccionar consulta

SELECT LAKE.NAME_TXT AS [Group], TRAWL_TRIP.TRAWL_TRIP_DAT AS Trawl_Date, Year([TRAWL_TRIP_DAT]) AS [Year], SAMPLE.WEIGHT_NUM AS Height, SAMPLE.WEIGHT_NUM/.4 AS Heigthcm FROM (((LAKE INNER JOIN STATION ON LAKE.LAKE_ID = STATION.LAKE_ID) INNER JOIN (NET_TYPE RIGHT JOIN (TRAWL_TYPE RIGHT JOIN TRAWL_TRIP ON TRAWL_TYPE.TRAWL_TYPE_ID = TRAWL_TRIP.TRAWL_TYPE_ID) ON NET_TYPE.NET_TYPE_ID = TRAWL_TRIP.NET_TYPE_ID) ON STATION.STATION_ID = TRAWL_TRIP.STATION_ID) INNER JOIN TRAWL ON TRAWL_TRIP.TRAWL_TRIP_ID = TRAWL.TRAWL_TRIP_ID) INNER JOIN (MATURITY_TYPE RIGHT JOIN (SPECIES_TYPE INNER JOIN SAMPLE ON SPECIES_TYPE.SPECIES_TYPE_ID = SAMPLE.SPECIES_TYPE_ID) ON MATURITY_TYPE.MATURITY_TYPE_ID = SAMPLE.MATURITY_TYPE_ID) ON TRAWL.TRAWL_ID = SAMPLE.TRAWL_ID WHERE TRAWL_TRIP.TRAWL_TRIP_DAT>=Nz([Forms]![frmReport]![txtTrawlDateFrom],[TRAWL_TRIP_DAT]) And TRAWL_TRIP.TRAWL_TRIP_DAT<=Nz([Forms]![frmReport]![txtTrawlDateTo],[TRAWL_TRIP_DAT]) AND TRAWL_TRIP.TRAWL_TRIP_DAT <> #10/4/2013# AND TRAWL_TRIP.TRAWL_TRIP_DAT <> #10/5/2013# AND LAKE.NAME_TXT = "A" AND Year(TRAWL_TRIP.TRAWL_TRIP_DAT) = 2012 AND Year(TRAWL_TRIP.TRAWL_TRIP_DAT) = 2013


sin la definición de su tabla es difícil darle la "buena" solución.

  1. abra su tabla de muestra y agregue una nueva columna "new_WEIGHT_NUM" (esta será su nueva columna para su valor correcto)

Si la consulta debajo tuyo te está mostrando las filas correctas. Puede usar esto para actualizar la tabla de muestra.

  1. Agregue el identificador único de la tabla de muestra en esta consulta a continuación
  2. Guarde la consulta a continuación como una consulta como ya hizo.

**

SELECT LAKE.NAME_TXT AS [Group], TRAWL_TRIP.TRAWL_TRIP_DAT AS Trawl_Date, Year([TRAWL_TRIP_DAT]) AS [Year], SAMPLE.WEIGHT_NUM AS Height SAMPLE.its_unique_identifier FROM (((LAKE INNER JOIN STATION ON LAKE.LAKE_ID = STATION.LAKE_ID) INNER JOIN (NET_TYPE RIGHT JOIN (TRAWL_TYPE RIGHT JOIN TRAWL_TRIP ON TRAWL_TYPE.TRAWL_TYPE_ID = TRAWL_TRIP.TRAWL_TYPE_ID) ON NET_TYPE.NET_TYPE_ID = TRAWL_TRIP.NET_TYPE_ID) ON STATION.STATION_ID = TRAWL_TRIP.STATION_ID) INNER JOIN TRAWL ON TRAWL_TRIP.TRAWL_TRIP_ID = TRAWL.TRAWL_TRIP_ID) INNER JOIN (MATURITY_TYPE RIGHT JOIN (SPECIES_TYPE INNER JOIN SAMPLE ON SPECIES_TYPE.SPECIES_TYPE_ID = SAMPLE.SPECIES_TYPE_ID) ON MATURITY_TYPE.MATURITY_TYPE_ID = SAMPLE.MATURITY_TYPE_ID) ON TRAWL.TRAWL_ID = SAMPLE.TRAWL_ID WHERE (((TRAWL_TRIP.TRAWL_TRIP_DAT)>=Nz([Forms]![frmReport]![txtTrawlDateFrom],[TRAWL_TRIP_DAT]) And (TRAWL_TRIP.TRAWL_TRIP_DAT)<=Nz([Forms]![frmReport]![txtTrawlDateTo],[TRAWL_TRIP_DAT])));

su consulta de actualización debería verse así: EDITAR

UPDATE SAMPLE inner join qry_exp_sampledata2 on sample.sample_id = qry_exp_sampledata2.sample_id SET sample.new_WEIGHT_NUM = (WEIGHT_NUM / 0.4)

no es necesario indicar en qué condición, como your above_query, solo se incluyen las filas que le interesan actualizar. Después de la actualización, compruebe si los valores son correctos, idealmente una actualización secundaria para corregir el campo WEIGHT_NUM con los valores correctos.

después de que hayas corregido los valores, puedes eliminar la columna new_num_weight ya que este fue un "temporal" de todos modos.

Publique las definiciones de su tabla para que tengamos más idea de lo que está buscando.


Ya casi estás ahí. Suponiendo que su consulta original de la actualización 1 funciona, puede crear una consulta haciendo referencia a ella y su Temp_query desde la actualización 2. De esta manera no tendrá que volver a escribir su consulta original, que ya es lo suficientemente compleja. En lugar de eso, simplemente tire su columna Heightcm. Puede hacerlo así, siempre y cuando agregue su columna de ID única a Temp_query.

SELECT Temp_query.[Height]/.4 as Heightcm, orig_qry.[IDvar], orig_qry.[Group], orig_qry.[Trawl_Date], orig_qry.[Year], orig_qry.[Height] FROM orig_qry INNER JOIN Temp_query ON orig_qry.[IDvar] = Temp_query.[IDvar]

O podría ser tan simple como el siguiente si está contento con la salida de Temp_Query, excepto la falta de Heightcm:

SELECT [Height]/.4 as Heightcm, [Group], [Trawl_Date], [Year], [Height] FROM Temp_query