<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Dom%C3%A9ny</id>
	<title>Domény - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Dom%C3%A9ny"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Dom%C3%A9ny&amp;action=history"/>
	<updated>2026-05-13T01:35:34Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Dom%C3%A9ny&amp;diff=305&amp;oldid=prev</id>
		<title>85.160.69.92 v 10. 8. 2007, 17:25</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Dom%C3%A9ny&amp;diff=305&amp;oldid=prev"/>
		<updated>2007-08-10T17:25:55Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION check_form_rodne_cislo(varchar, boolean)&lt;br /&gt;
RETURNS boolean AS $$&lt;br /&gt;
DECLARE&lt;br /&gt;
  str_parts varchar[];&lt;br /&gt;
  num_parts integer[];&lt;br /&gt;
  after_1953 boolean;&lt;br /&gt;
  birthday_str varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT INTO str_parts regexp_matches&lt;br /&gt;
     FROM regexp_matches($1, E&amp;#039;^(\\d{2})(\\d{2})(\\d{2})(/)?(\\d{3,4})$&amp;#039;);&lt;br /&gt;
  IF FOUND THEN&lt;br /&gt;
    -- Test existence lomitka v rodnem cisle rizeny druhym parametrem,                                                                  &lt;br /&gt;
    -- ve vyznamu NULL (nema vyznam), true - povinne, false - nepovinne.                                                                &lt;br /&gt;
    IF $2 &amp;lt;&amp;gt; (str_parts[4] IS NOT NULL) THEN&lt;br /&gt;
      RETURN false;&lt;br /&gt;
    END IF;&lt;br /&gt;
    -- Test modulo 11 se provadi pouze tehdy, pokud existuje                                                                            &lt;br /&gt;
    -- kontrolni cislice, tj. pocinaje rokem 1954.                                                                                      &lt;br /&gt;
    after_1953 := char_length(str_parts[5]) = 4;&lt;br /&gt;
    IF after_1953&lt;br /&gt;
       AND to_number($1, CASE WHEN str_parts[4] IS NULL&lt;br /&gt;
                              THEN &amp;#039;9999999999&amp;#039;&lt;br /&gt;
                              ELSE &amp;#039;999999/9999&amp;#039; END) % 11 &amp;lt;&amp;gt; 0 THEN&lt;br /&gt;
      RETURN false;&lt;br /&gt;
    END IF;&lt;br /&gt;
    -- Kontrola validniho datumu, po roce 2004 se mohou                                                                                 &lt;br /&gt;
    -- k mesici pricitat hodnoty 20 (pro muze) a 70 pro zeny.                                                                           &lt;br /&gt;
    num_parts := ARRAY[to_number(str_parts[1],&amp;#039;99&amp;#039;),&lt;br /&gt;
                       to_number(str_parts[2],&amp;#039;99&amp;#039;),&lt;br /&gt;
                       to_number(str_parts[3],&amp;#039;99&amp;#039;)];&lt;br /&gt;
    num_parts := ARRAY[CASE WHEN NOT after_1953&lt;br /&gt;
                            THEN 1900 + num_parts[1]&lt;br /&gt;
                            WHEN after_1953 AND num_parts[1] &amp;gt;= 54&lt;br /&gt;
                            THEN 1900 + num_parts[1]&lt;br /&gt;
                            ELSE 2000 + num_parts[1] END,&lt;br /&gt;
                       CASE WHEN num_parts[2] &amp;gt; 70&lt;br /&gt;
                            THEN num_parts[2] - 70&lt;br /&gt;
                            WHEN num_parts[2] &amp;gt; 50&lt;br /&gt;
                            THEN num_parts[2] - 50&lt;br /&gt;
                            WHEN num_parts[2] &amp;gt; 20&lt;br /&gt;
                            THEN num_parts[2] - 20&lt;br /&gt;
                            ELSE num_parts[2] END,&lt;br /&gt;
                       num_parts[3]];&lt;br /&gt;
    birthday_str := replace(to_char(num_parts[1],&amp;#039;9999&amp;#039;)&lt;br /&gt;
                            || to_char(num_parts[2],&amp;#039;09&amp;#039;)&lt;br /&gt;
                            || to_char(num_parts[3],&amp;#039;09&amp;#039;),&lt;br /&gt;
                               &amp;#039; &amp;#039;,&amp;#039;&amp;#039;);&lt;br /&gt;
    RETURN birthday_str = to_char(to_date(birthday_str, &amp;#039;YYYYMMDD&amp;#039;),&lt;br /&gt;
                                  &amp;#039;YYYYMMDD&amp;#039;);&lt;br /&gt;
  END IF;&lt;br /&gt;
  RETURN false;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
-- Predpokladam validni vstup (overeny funkci check_form_rodne_cislo).                                                                  &lt;br /&gt;
-- Typ parametru varchar je zvolen proto, protoze je predkem domen rc,                                                                  &lt;br /&gt;
-- rc1 a rc2. Domeny se lisi vztahem vuci lomitku uvnitr rodneho cisla.                                                                 &lt;br /&gt;
CREATE OR REPLACE FUNCTION form_rodne_cislo_to_date(varchar)&lt;br /&gt;
RETURNS date AS $$&lt;br /&gt;
DECLARE&lt;br /&gt;
  str_parts varchar[];&lt;br /&gt;
  num_parts integer[];&lt;br /&gt;
  after_1953 boolean;&lt;br /&gt;
  birthday_str varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT INTO str_parts regexp_matches&lt;br /&gt;
     FROM regexp_matches($1, E&amp;#039;^(\\d{2})(\\d{2})(\\d{2})(/)?(\\d{3,4})$&amp;#039;);&lt;br /&gt;
  IF FOUND THEN&lt;br /&gt;
    after_1953 := char_length(str_parts[5]) = 4;&lt;br /&gt;
    -- Po roce 2004 se mohou k mesici pricitat                                                                                          &lt;br /&gt;
    -- hodnoty 20 (pro muze) a 70 pro zeny. Pred timto rokem                                                                            &lt;br /&gt;
    -- se vzdy pricita 50 pro zeny                                                                                                      &lt;br /&gt;
    num_parts := ARRAY[to_number(str_parts[1],&amp;#039;99&amp;#039;),&lt;br /&gt;
                       to_number(str_parts[2],&amp;#039;99&amp;#039;),&lt;br /&gt;
                       to_number(str_parts[3],&amp;#039;99&amp;#039;)];&lt;br /&gt;
    num_parts := ARRAY[CASE WHEN NOT after_1953&lt;br /&gt;
                            THEN 1900 + num_parts[1]&lt;br /&gt;
                            WHEN after_1953 AND num_parts[1] &amp;gt;= 54&lt;br /&gt;
                            THEN 1900 + num_parts[1]&lt;br /&gt;
                            ELSE 2000 + num_parts[1] END,&lt;br /&gt;
                       CASE WHEN num_parts[2] &amp;gt; 70&lt;br /&gt;
                            THEN num_parts[2] - 70&lt;br /&gt;
                            WHEN num_parts[2] &amp;gt; 50&lt;br /&gt;
                            THEN num_parts[2] - 50&lt;br /&gt;
                            WHEN num_parts[2] &amp;gt; 20&lt;br /&gt;
                            THEN num_parts[2] - 20&lt;br /&gt;
                            ELSE num_parts[2] END,&lt;br /&gt;
                       num_parts[3]];&lt;br /&gt;
    RETURN to_date(&lt;br /&gt;
                   replace(to_char(num_parts[1],&amp;#039;9999&amp;#039;)&lt;br /&gt;
                            || to_char(num_parts[2],&amp;#039;09&amp;#039;)&lt;br /&gt;
                            || to_char(num_parts[3],&amp;#039;09&amp;#039;),&lt;br /&gt;
                               &amp;#039; &amp;#039;,&amp;#039;&amp;#039;),&lt;br /&gt;
                   &amp;#039;YYYYMMDD&amp;#039;);&lt;br /&gt;
  END IF;&lt;br /&gt;
  RAISE NOTICE &amp;#039;Incorrect format of type rodne cislo (value: %)&amp;#039;, $1;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
-- Predpokladam validni vstup (overeny funkci check_form_rodne_cislo).                                                                  &lt;br /&gt;
-- Typ parametru varchar je zvolen proto, protoze je predkem domen rc,                                                                  &lt;br /&gt;
-- rc1 a rc2. Domeny se lisi vztahem vuci lomitku uvnitr rodneho cisla.                                                                 &lt;br /&gt;
CREATE OR REPLACE FUNCTION form_rodne_cislo_to_bool(varchar)&lt;br /&gt;
RETURNS boolean AS $$&lt;br /&gt;
DECLARE&lt;br /&gt;
  str_part varchar[];&lt;br /&gt;
  birthday_mm integer;&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT INTO str_part regexp_matches&lt;br /&gt;
     FROM regexp_matches($1, E&amp;#039;^\\d{2}(\\d{2})\\d{2}/?\\d{3,4}$&amp;#039;);&lt;br /&gt;
  IF FOUND THEN&lt;br /&gt;
    birthday_mm := to_number(str_part[1],&amp;#039;09&amp;#039;);&lt;br /&gt;
    RETURN CASE WHEN birthday_mm &amp;gt; 50&lt;br /&gt;
                THEN false&lt;br /&gt;
                ELSE true END;&lt;br /&gt;
  END IF;&lt;br /&gt;
  RAISE NOTICE &amp;#039;Incorrect format of type rodne cislo (value: %)&amp;#039;, $1;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
-- Registrace domen                                                                                                                     &lt;br /&gt;
CREATE DOMAIN rc  VARCHAR CHECK (check_form_rodne_cislo(value, null::boolean));&lt;br /&gt;
CREATE DOMAIN rc1 VARCHAR CHECK (check_form_rodne_cislo(value, false));&lt;br /&gt;
CREATE DOMAIN rc2 VARCHAR CHECK (check_form_rodne_cislo(value, true));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>85.160.69.92</name></author>
	</entry>
</feed>