我正在努力获取这两个查询:
SELECT min(to_date(nullif(mydatetext,''), 'DD.MM.YYYY')) AS dmin, max(to_date(nullif(mydatetxt,''), 'DD.MM.YYYY')) AS dmax FROM mytable
和
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'))
我可以将结果读取为最小日期,最大日期,最小和最大日期之间(包括最小和最大日期)的日期计数。但是这里有几个问题。
第二个查询无法按预期运行或根本无法运行,因此必须进行改进。如果可以在单个查询(?)中编写这两个查询,我可以将第一部分中的dmin和dmax变量用作第二部分中的变量吗?像这样:
SELECT count(*) FROM mytable WHERE to_date(nullif(mydatetxt,'')) 'ERROR HERE BETWEEN dmin AND dmax
最后请帮助解决这种情况。
可行的代码:
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
解决方案:最终这是非常快的改进版本,欧文(Ervin)请给:
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
给定此表(如您应该提供的):
CREATE TEMP TABLE tbl ( id int PRIMARY KEY ,mydatetxt text ); INSERT INTO tbl VALUES (1, '01.02.2011') ,(2, '05.01.2011') ,(3, '06.03.2012') ,(4, '07.08.2011') ,(5, '04.03.2013') ,(6, '06.08.2011') ,(7, '') -- empty string ,(8, '02.02.2013') ,(9, '04.06.2010') ,(10, '10.10.2012') ,(11, '04.04.2012') ,(12, NULL) -- NULL ,(13, '04.03.2013'); -- min date a 2nd time
该查询应产生您描述的内容:
结果为最小日期,最大日期,最小和最大日期之间(包括最小和最大日期)的日期计数
WITH base AS ( SELECT to_date(mydatetxt, 'DD.MM.YYYY') AS the_date FROM tbl WHERE mydatetxt <> '' -- excludes NULL and '' ) 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
- > SQLfiddle演示
CTE需要Postgres 8.4或更高版本。 考虑升级到最新版本的9.1,即当前的 9.1.9 。