PostgreSQL, min, max y conteo de fechas en rango
Esta pregunta está basada en dos anteriores.aquí yaquí.
Estoy tratando muy duro de obtener esas dos consultas:
SELECT min(to_date(nullif(mydatetext,''), 'DD.MM.YYYY')) AS dmin,
max(to_date(nullif(mydatetxt,''), 'DD.MM.YYYY')) AS dmax
FROM mytable
y
SELECT count(*)
FROM mytable
WHERE
to_date(nullif(mydatetxt,'')) 'ERROR HERE
BETWEEN
max(to_date(nullif(mydatetxt,''), 'DD.MM.YYYY'))
AND
min(to_date(nullif(mydatetxt,''), 'DD.MM.YYYY'))
en uno solo para que pueda leer el resultado como fecha mínima, fecha máxima, recuento de fechas entre las fechas mínimas y máximas incluidas. Pero aquí hay algunos problemas.
La segunda consulta no funciona como se esperaba o no funciona en absoluto, por lo que debe mejorarse. Si esas dos consultas se pueden escribir en una sola consulta (?), ¿Puedo usar las variables dmin y dmax de la primera parte como variables en la segunda parte? Me gusta esto:
SELECT count(*)
FROM mytable
WHERE
to_date(nullif(mydatetxt,'')) 'ERROR HERE
BETWEEN
dmin
AND
dmax
Por favor ayuda para resolver esta situación finalmente.
Código realizable:
Using cmd As New NpgsqlCommand("SELECT my_id, mydate FROM " & mytable, conn)
Using dr As NpgsqlDataReader = cmd.ExecuteReader()
While dr.Read()
mydate = CStr(dr(1))
If IsDate(mydate) Then
Dim dat As Date = CDate(mydate.Substring(6, 4) & "/" & mydate.Substring(3, 2) & "/" & mydate.Substring(0, 2))
If dat < mindate Or mindate = Nothing Then
mindate = dat
End If
If dat > maxddate Or maxdate = Nothing Then
maxdate = dat
End If
count += 1
End If
End While
End Using
End Using
SOLUCIÓN: Y esta es finalmente una versión muy rápida y mejorada que Ervin amablemente ofrece:
Using cmd As New NpgsqlCommand( _
"WITH base AS (" & _
" SELECT TO_DATE(datum, 'DD.MM.YYYY') AS the_date " & _
" FROM " & myKalkTable & " " & _
" WHERE datum <> '') " & _
" SELECT MIN(the_date) AS dmin, " & _
" MAX(the_date) AS dmax, " & _
" COUNT(*) AS ct_incl, " & _
" (SELECT COUNT(*) " & _
" FROM base b1 " & _
" WHERE(b1.the_date < max(b.the_date)) " & _
" AND b1.the_date > min(b.the_date)) " & _
" AS ct_excl " & _
" FROM base b", conn)
Using dr As NpgsqlDataReader = cmd.ExecuteReader()
While dr.Read()
mindate = CType(CDate(CStr(dr(0))), Date)
maxdate = CType(CDate(CStr(dr(1))), Date)
count = CInt(dr(2))
End While
End Using
End Using