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.
- 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.
- Agregue el identificador único de la tabla de muestra en esta consulta a continuación
- 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