Jump to content
Viniciusr9

Horas entre datas

Recommended Posts

Boa tarde pessoal,

basicamente eu preciso do retorno de horas entre duas datas, porém tenho condições a tratar .

basicamente tenho 2 colunas ( dt_fim e dt_ini ) que representam data final e data inicial. Preciso da diferença entre as duas retornada em uma outra coluna (hr_ausencias) , porém a cada dia posso computar no máximo 9 horas, e desconsiderar finais de semana e feriados( esses cadastrados em uma tabela) . Seria melhor tratar isso com uma Trigger , um Script PL/SQL , como me sugerem? Agradeço quem puder ajudar.

Share this post


Link to post
Share on other sites

Bom dia Motta, analisei e ambas soluções são inviáveis para mim , eu precisaria de algo mais específico , como por exemplo : ( suponha que tenho minha data inicial no dia 31/05/2019 08:00 e a data final no dia 03/06/2019 12:00 . Nesse caso seria computado no máximo 9 horas por dia entre as datas, e desconsiderado os finais de semana e feriados , assim ao final eu teria como resultado as horas que necessito ).

 

 

 

Share this post


Link to post
Share on other sites

Assim, eu já vi essas várias functions , blocos e etc que tem por aí, inclusive eu tenho uma que adaptei pra me retornar a quantidade de horas estimadas a trabalhar em um mês. Meu problema esta mais em fixar um valor máximo por período entre as 2 variáveis, por exemplo DT_INI (28/05/2019 08:00 )  DT_FIM ( 30/05/2019 09:00) . num calculo direto isso daria 49horas. eu preciso que volte 19 horas ( 9horas do dia 28, 9horas do dia 29 e 1 hora do dia 30), mas to me embaralhando pra montar o script nessa parte. Se puder me dar um exemplo parecido ou um caminho pra começar isso eu agradeço .

Share this post


Link to post
Share on other sites

Eu faria um FUNCTION somente para isto , retornando as "horas úteis" entre duas datas levando em conta todas as regras.

 

Não é simples mas também não é um biche de sete cabeças tendo conhecimento de plsql

 

Tendo dúvidas vai postando aí.

Share this post


Link to post
Share on other sites

eu tentei uma trigger mas deu meio errado . Vou tentar pela function , só preciso pensar um pouco mais nas regras internas ( por exemplo a de contar as horas no dia e travar após passar e contar o restante dos dias) . Não sei se aqui no forum tem algum específico pra Apex, é que eu utilizo ele e seria pra aplicar dentro de um item de formulario que eu estou montando o script.

Obrigado pela ajuda, qualquer coisa eu volto aqui . 

Share this post


Link to post
Share on other sites

Montei um script que está funcionando , mas notei que a conta das horas internamente não está como eu preciso, não estou conseguindo finalizar essa parte, poderia verificar e me auxiliar nesse pedaço? Tipo ele calcula as horas mas sempre um valor grande, eu preciso que dê as horas exatas , por exemplo se a DT_FIM = '30/05/2019 16:00' e DT_INI = '30/05/2019 18:00' o retorno de horas ao final na variável precisa ser 2 . 

 

segue o scritp: (deixei os output pra validar os resultados , e os comentarios nos ifs pra facilitar compreensao)

DECLARE
  VA_CONTA         NUMBER := 0;
  VA_DT_INI        DATE;
  VA_DT_FIM        DATE;
  VA_QT_DIAS       NUMBER := 0;
  VA_DT_ATUAL      DATE;
  VA_FERIADO_SN    NUMBER := 0;
  VA_TOT_HR_AUS    NUMBER:= 0;
  VA_HR_AUS_SEXTA  NUMBER:= 0;
  VA_TOT_DIAS      NUMBER :=0;
  VA_TOT_SEXTA     NUMBER := 0;

BEGIN
  select TRUNC(TO_DATE('31/05/2019 08:00', 'DD/MM/RRRR HH24:MI')) -
       TRUNC(TO_DATE('14/05/2019 09:00', 'DD/MM/RRRR HH24:MI')),
       TO_DATE('14/05/2019 09:00', 'DD/MM/RRRR HH24:MI'),
       TO_DATE('31/05/2019 08:00', 'DD/MM/RRRR HH24:MI')
  INTO VA_QT_DIAS, VA_DT_INI, VA_DT_FIM
  from DUAL;
 /* select DISTINCT (TRUNC(A.DT_FIM) - TRUNC(A.DT_INI)), 
          A.DT_INI, 
          A.DT_FIM
     INTO VA_QT_DIAS, 
          VA_DT_INI, 
          VA_DT_FIM
          FROM AUSENCIAS A
               WHERE CD_AUSENCIA = 174;*/

  DBMS_OUTPUT.put_line('Dia inicial: ' || VA_DT_INI);
  DBMS_OUTPUT.put_line('Dia final: ' || VA_DT_FIM);
  DBMS_OUTPUT.put_line('total dias: ' || VA_QT_DIAS);
  DBMS_OUTPUT.put_line('------------------');
    WHILE VA_CONTA <= VA_QT_DIAS LOOP -- VERIFICA CONTADOR MENOR QUE TOTAL DE DIAS ENTRE AS DATAS (INI E FIM)
      
      VA_DT_ATUAL := VA_DT_INI + VA_CONTA;
      IF VA_DT_ATUAL <= VA_DT_FIM THEN --1 VERIFICA SE DATA DO LAÇO MENOR QUE DATA FINAL
          SELECT COUNT(*) INTO VA_FERIADO_SN FROM FERIADOS WHERE TRUNC(DT_FERIADO) = TRUNC(VA_DT_ATUAL);
         -- DBMS_OUTPUT.PUT_LINE('ATUAL:' || VA_DT_ATUAL ||'FERIADO:' ||VA_FERIADO_SN);--
         IF VA_FERIADO_SN = 0 THEN -- RETORNO 0 NÃO É FERIADO
            IF TO_CHAR(VA_DT_ATUAL, 'D') NOT IN (1, 7) THEN --2 VERIFICA DIA DIFERENTE DE SABADO E DOMINGO
                VA_TOT_HR_AUS := (VA_DT_FIM - VA_DT_ATUAL) * 24;
               IF (TO_CHAR(VA_DT_FIM, 'HH24:MI') BETWEEN '08' AND '18') AND (TO_CHAR(VA_DT_INI, 'HH24:MI') BETWEEN '08' AND '18')THEN --3 VERIFICA SE HORA ESTÁ ENTRE 08 E 18       
                   IF (TO_CHAR(VA_DT_ATUAL, 'D') <> (6) AND VA_TOT_HR_AUS >9) THEN --4 VERIFICA DIA DIFERENTE DE SEXTA E SE HORA MAIOR QUE 9
                          
                          VA_TOT_DIAS := VA_TOT_DIAS +1;
                          VA_TOT_HR_AUS := 9;
                           DBMS_OUTPUT.put_line('VALOR ATUAL:' || VA_TOT_HR_AUS);
                           DBMS_OUTPUT.put_line('--------------'); 
                            
                                           
                        ELSIF (TO_CHAR(VA_DT_ATUAL, 'D') = 6 AND VA_TOT_HR_AUS > 8) THEN -- VERIFICA DIA IGUAL SEXTA E SE HORA MAIOR QUE 8
                        --  VA_TOT_HR_AUS := 8;
                           VA_HR_AUS_SEXTA := 8;
                           DBMS_OUTPUT.put_line('VALOR ATUAL:' || VA_TOT_HR_AUS);
                           DBMS_OUTPUT.put_line('--------------');
                         VA_TOT_SEXTA := VA_TOT_SEXTA +1;
                         
                     
                      END IF; --4  
                       
                END IF; --3
                 
            END IF; --2    
           VA_TOT_HR_AUS := (VA_TOT_HR_AUS*VA_TOT_DIAS) + (VA_HR_AUS_SEXTA * VA_TOT_SEXTA);
       END IF; --1
      
     END IF;  
        VA_DT_ATUAL := VA_DT_ATUAL +1;
       DBMS_OUTPUT.PUT_LINE('CALCULO: ' || VA_CONTA);
       VA_CONTA := VA_CONTA + 1;
       
      DBMS_OUTPUT.put_line('DATA ATUAL:' || VA_DT_ATUAL);
       
  
  END LOOP;
   DBMS_OUTPUT.PUT_LINE('DIA SEMANA:' || VA_TOT_DIAS);
   DBMS_OUTPUT.PUT_LINE('DIA SEXTA:' || VA_TOT_SEXTA);  
  DBMS_OUTPUT.put_line('VALOR FINAL :' || ROUND(VA_TOT_HR_AUS, 2)); -- resultado retornado que me interessa
END;


 

Share this post


Link to post
Share on other sites

Fiz pára

Dia inicial: 30/05/19
Dia final: 31/05/19
total dias: 1
------------------
VALOR ATUAL:9
--------------
CALCULO: 0
DATA ATUAL:31/05/19
CALCULO: 1
DATA ATUAL:01/06/19
DIA SEMANA:1
DIA SEXTA:0
VALOR FINAL :9

 

o que está errado ?

Share this post


Link to post
Share on other sites

por exemplo , se testar DT_INI = 30/05/2019 08:00 e DT_FIM = 30/05/2019 10:00 eu preciso que me retorne 2 ao final ,pois são 2 horas de diferença . As horas são o que importam pra mim entre as datas 

Share this post


Link to post
Share on other sites

você diz a coluna em questão ou o sentido do que eu quero no script ?

Se for a coluna, preciso desse valor retornado dentro da coluna hr_ausencia ( da tabela ausencias)

Se for o sentido do script, seriam na vdd as horas "inutilizaveis por ausencia"

Share this post


Link to post
Share on other sites

Por exemplo entre

 

30/5/19 00:00

e

31/5/19 23:59

 

temos 48 horas "cheias" e 16 horas "úteis"

 

 

Share this post


Link to post
Share on other sites

Seriam 17 horas úteis certo( 9 horas da quinta e 8 horas da sexta) ? . no caso sim, são 17 horas "úteis". pra esses casos que ultrapassam um dia, a contagem retorna correto, porém pra contagens menores que um dia o resultado não está correto, por exemplo como citei DT_INI = 30/05/2019 08:00 e DT_FIM = 30/05/2019 10:00 , deve retornar 2 horas "úteis"

Share this post


Link to post
Share on other sites

indo um pouco mais além se não for abusar também, como posso fazer para setar esse resultado na coluna da tabela de ausencias ? por exemplo, abaixo tenho um update ao final do loop que carrega o resultado pra coluna de hr_ausencia referente a ultima linha inserida, porém meu resultado é sempre 0 , nao consegui encontrar o erro

 

DECLARE
  VA_CONTA         NUMBER := 0;
  VA_DT_INI        DATE;
  VA_DT_FIM        DATE;
  VA_QT_DIAS       NUMBER := 0;
  VA_DT_ATUAL      DATE;
  VA_FERIADO_SN    NUMBER := 0;
  VA_TOT_HR_AUS    NUMBER:= 0;
  VA_HR_AUS_SEXTA  NUMBER:= 0;
  VA_TOT_DIAS      NUMBER :=0;
  VA_TOT_SEXTA     NUMBER := 0;
BEGIN
/*SELECT trunc(to_date('03/06/2019 13:00','dd/mm/yyyy hh24:mi')) - trunc(to_date('03/06/2019 18:00','dd/mm/yyyy hh24:mi')),
trunc(to_date('03/06/2019 13:00','dd/mm/yyyy hh24:mi')),
trunc(to_date('03/06/2019 18:00','dd/mm/yyyy hh24:mi'))
into VA_QT_DIAS, 
     VA_DT_INI, 
     VA_DT_FIM
     from dual;*/
  select DISTINCT (TRUNC(A.DT_FIM) - TRUNC(A.DT_INI)), 
                   A.DT_INI, 
                   A.DT_FIM
              INTO VA_QT_DIAS, 
                   VA_DT_INI, 
                   VA_DT_FIM
                   FROM AUSENCIAS A
                         WHERE A.DT_INC = (SELECT MAX(DT_INC) FROM AUSENCIAS);
    WHILE VA_CONTA <= VA_QT_DIAS LOOP -- VERIFICA CONTADOR(VA_CONTA) EQUANTO MENOR QUE TOTAL DE DIAS ENTRE AS DATAS (INI E FIM)
      VA_DT_ATUAL := VA_DT_INI + VA_CONTA;
      IF VA_DT_ATUAL <= VA_DT_FIM THEN --1 VERIFICA SE DATA DO LAÇO MENOR QUE DATA FINAL
          SELECT COUNT(*) INTO VA_FERIADO_SN FROM FERIADOS WHERE TRUNC(DT_FERIADO) = TRUNC(VA_DT_ATUAL);
         IF VA_FERIADO_SN = 0 THEN --2 RETORNO 0 NÃO É FERIADO
            IF TO_CHAR(VA_DT_ATUAL, 'D') NOT IN (1, 7) THEN --3 VERIFICA DIA DIFERENTE DE SABADO E DOMINGO
                VA_TOT_HR_AUS := (VA_DT_FIM - VA_DT_ATUAL) * 24;
               IF (TO_CHAR(VA_DT_FIM, 'HH24:MI') BETWEEN '08' AND '18') AND (TO_CHAR(VA_DT_INI, 'HH24:MI') BETWEEN '08' AND '18')THEN --4 VERIFICA SE HORA ESTÁ ENTRE 08 E 18       
                   IF (TO_CHAR(VA_DT_ATUAL, 'D') <> (6) AND VA_TOT_HR_AUS >9) THEN --5 VERIFICA DIA DIFERENTE DE SEXTA E SE HORA MAIOR QUE 9
                          VA_TOT_DIAS := VA_TOT_DIAS +1;
                          VA_TOT_HR_AUS := 9;                
                        ELSIF (TO_CHAR(VA_DT_ATUAL, 'D') = 6 AND VA_TOT_HR_AUS > 8) THEN -- VERIFICA DIA IGUAL SEXTA E SE HORA MAIOR QUE 8
                           VA_HR_AUS_SEXTA := 8;
                         VA_TOT_SEXTA := VA_TOT_SEXTA +1;
                   END IF; --5   
               END IF; --4
            END IF; --3    
         END IF; --2 
         VA_TOT_HR_AUS := (VA_TOT_HR_AUS*VA_TOT_DIAS) + (VA_HR_AUS_SEXTA * VA_TOT_SEXTA);
      END IF; --1  
        VA_DT_ATUAL := VA_DT_ATUAL +1;
        VA_CONTA := VA_CONTA + 1;
    END LOOP;
    UPDATE AUSENCIAS SET HR_AUSENCIA = VA_TOT_HR_AUS WHERE DT_INC = (SELECT MAX(A.DT_INC) FROM AUSENCIAS A);
END;

Share this post


Link to post
Share on other sites

Eu faria o while somando horas a data.hora 1/24 e testando se é hora útil ou não, segunda se tiver tempobtento montar.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Rodrigo5468
      Olá, boa tarde!
       
      Eu estava procurando na internet, mas não obtive nenhum resultado significativo.
      Eu preciso de um script em php que converte os links do youtube para o formato .mp4. Como que eu posso fazer isso? Alguma dica?
      Quero que quando o usuário informa o link do youtube no input e clica no botão de converter baixe o vídeo e faz a conversão para .mp4 e fornece para o usuário o link convertido para .mp4.
       
       
      Obrigado desde já.
    • By Rodrigo5468
      Olá, tudo bem? Espero que sim.
       
      Eu seguir esse tutorial e essa atualização para conseguir o código final. Mas o meu site fica totalmente, não exibe absolutamente nada. Eu venho aqui recorrer a vocês, pois lá não irei ter nenhum tipo de suporte. Por favor, quem for me auxiliar com esse pequeno problema, leia o tópico do tutorial. Mas o Fruition é um script para personalizar o domínio utilizando o Notion.
      /* CONFIGURATION STARTS HERE */ /* Step 1: enter your domain name like fruitionsite.com */ const MY_DOMAIN = 'DOMINIO'; /* * Step 2: enter your URL slug to page ID mapping * The key on the left is the slug (without the slash) * The value on the right is the Notion page ID */ const SLUG_TO_PAGE = { '': 'CODIGO_DA_PÁGINA_PÚBLICA_DO_NOTION' }; /* Step 3: enter your page title and description for SEO purposes */ const PAGE_TITLE = ''; const PAGE_DESCRIPTION = ''; /* Step 4: enter a Google Font name, you can choose from https://fonts.google.com */ const GOOGLE_FONT = ''; /* Step 5: enter any custom scripts you'd like */ const CUSTOM_SCRIPT = ``; /* CONFIGURATION ENDS HERE */ const PAGE_TO_SLUG = {}; const slugs = []; const pages = []; Object.keys(SLUG_TO_PAGE).forEach(slug => { const page = SLUG_TO_PAGE[slug]; slugs.push(slug); pages.push(page); PAGE_TO_SLUG[page] = slug; }); addEventListener("fetch", event => { event.respondWith(fetchAndApply(event.request)); }); function generateSitemap() { let sitemap = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; slugs.forEach( (slug) => (sitemap += "<url><loc>https://" + MY_DOMAIN + "/" + slug + "</loc></url>") ); sitemap += "</urlset>"; return sitemap; } const corsHeaders = { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, HEAD, POST, PUT, OPTIONS", "Access-Control-Allow-Headers": "Content-Type" }; function handleOptions(request) { if ( request.headers.get("Origin") !== null && request.headers.get("Access-Control-Request-Method") !== null && request.headers.get("Access-Control-Request-Headers") !== null ) { // Handle CORS pre-flight request. return new Response(null, { headers: corsHeaders }); } else { // Handle standard OPTIONS request. return new Response(null, { headers: { Allow: "GET, HEAD, POST, PUT, OPTIONS" } }); } } async function fetchAndApply(request) { if (request.method === "OPTIONS") { return handleOptions(request); } let url = new URL(request.url); url.hostname = 'www.notion.so'; if (url.pathname === "/robots.txt") { return new Response("Sitemap: https://" + MY_DOMAIN + "/sitemap.xml"); } if (url.pathname === "/sitemap.xml") { let response = new Response(generateSitemap()); response.headers.set("content-type", "application/xml"); return response; } let response; if (url.pathname.startsWith("/app") && url.pathname.endsWith("js")) { response = await fetch(url.toString()); let body = await response.text(); response = new Response( body .replace(/www.notion.so/g, MY_DOMAIN) .replace(/notion.so/g, MY_DOMAIN), response ); response.headers.set("Content-Type", "application/x-javascript"); return response; } else if (url.pathname.startsWith("/api")) { // Forward API response = await fetch(url.toString(), { body: request.body, headers: { "content-type": "application/json;charset=UTF-8", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" }, method: "POST" }); response = new Response(response.body, response); response.headers.set("Access-Control-Allow-Origin", "*"); return response; } else if (slugs.indexOf(url.pathname.slice(1)) > -1) { const pageId = SLUG_TO_PAGE[url.pathname.slice(1)]; return Response.redirect("https://" + MY_DOMAIN + "/" + pageId, 301); } else { response = await fetch(url.toString(), { body: request.body, headers: request.headers, method: request.method }); response = new Response(response.body, response); response.headers.delete("Content-Security-Policy"); response.headers.delete("X-Content-Security-Policy"); } return appendJavascript(response, SLUG_TO_PAGE); } class MetaRewriter { element(element) { if (PAGE_TITLE !== "") { if ( element.getAttribute("property") === "og:title" || element.getAttribute("name") === "twitter:title" ) { element.setAttribute("content", PAGE_TITLE); } if (element.tagName === "title") { element.setInnerContent(PAGE_TITLE); } } if (PAGE_DESCRIPTION !== "") { if ( element.getAttribute("name") === "description" || element.getAttribute("property") === "og:description" || element.getAttribute("name") === "twitter:description" ) { element.setAttribute("content", PAGE_DESCRIPTION); } } if ( element.getAttribute("property") === "og:url" || element.getAttribute("name") === "twitter:url" ) { element.setAttribute("content", MY_DOMAIN); } if (element.getAttribute("name") === "apple-itunes-app") { element.remove(); } } } class HeadRewriter { element(element) { if (GOOGLE_FONT !== "") { element.append( `<link href='https://fonts.googleapis.com/css?family=${GOOGLE_FONT.replace(' ', '+')}:Regular,Bold,Italic&display=swap' rel='stylesheet'> <style>* { font-family: "${GOOGLE_FONT}" !important; }</style>`, { html: true } ); } element.append( `<style> div.notion-topbar > div > div:nth-child(3) { display: none !important; } div.notion-topbar > div > div:nth-child(4) { display: none !important; } div.notion-topbar > div > div:nth-child(5) { display: none !important; } div.notion-topbar > div > div:nth-child(6) { display: none !important; } div.notion-topbar-mobile > div:nth-child(3) { display: none !important; } div.notion-topbar-mobile > div:nth-child(4) { display: none !important; } div.notion-topbar > div > div:nth-child(1n).toggle-mode { display: block !important; } div.notion-topbar-mobile > div:nth-child(1n).toggle-mode { display: block !important; } </style>`, { html: true } ); } } class BodyRewriter { constructor(SLUG_TO_PAGE) { this.SLUG_TO_PAGE = SLUG_TO_PAGE; } element(element) { element.append( `<script> const SLUG_TO_PAGE = ${JSON.stringify(this.SLUG_TO_PAGE)}; const PAGE_TO_SLUG = {}; const slugs = []; const pages = []; const el = document.createElement('div'); let redirected = false; Object.keys(SLUG_TO_PAGE).forEach(slug => { const page = SLUG_TO_PAGE[slug]; slugs.push(slug); pages.push(page); PAGE_TO_SLUG[page] = slug; }); function getPage() { return location.pathname.slice(-32); } function getSlug() { return location.pathname.slice(1); } function updateSlug() { const slug = PAGE_TO_SLUG[getPage()]; if (slug != null) { history.replaceState(history.state, '', '/' + slug); } } function onDark() { el.innerHTML = '<div title="Change to Light Mode" style="margin-left: auto; margin-right: 14px; min-width: 0px;"><div role="button" tabindex="0" style="user-select: none; transition: background 120ms ease-in 0s; cursor: pointer; border-radius: 44px;"><div style="display: flex; flex-shrink: 0; height: 14px; width: 26px; border-radius: 44px; padding: 2px; box-sizing: content-box; background: rgb(46, 170, 220); transition: background 200ms ease 0s, box-shadow 200ms ease 0s;"><div style="width: 14px; height: 14px; border-radius: 44px; background: white; transition: transform 200ms ease-out 0s, background 200ms ease-out 0s; transform: translateX(12px) translateY(0px);"></div></div></div></div>'; document.body.classList.add('dark'); __console.environment.ThemeStore.setState({ mode: 'dark' }); }; function onLight() { el.innerHTML = '<div title="Change to Dark Mode" style="margin-left: auto; margin-right: 14px; min-width: 0px;"><div role="button" tabindex="0" style="user-select: none; transition: background 120ms ease-in 0s; cursor: pointer; border-radius: 44px;"><div style="display: flex; flex-shrink: 0; height: 14px; width: 26px; border-radius: 44px; padding: 2px; box-sizing: content-box; background: rgba(135, 131, 120, 0.3); transition: background 200ms ease 0s, box-shadow 200ms ease 0s;"><div style="width: 14px; height: 14px; border-radius: 44px; background: white; transition: transform 200ms ease-out 0s, background 200ms ease-out 0s; transform: translateX(0px) translateY(0px);"></div></div></div></div>'; document.body.classList.remove('dark'); __console.environment.ThemeStore.setState({ mode: 'light' }); } function toggle() { if (document.body.classList.contains('dark')) { onLight(); } else { onDark(); } } function addDarkModeButton(device) { const nav = device === 'web' ? document.querySelector('.notion-topbar').firstChild : document.querySelector('.notion-topbar-mobile'); el.className = 'toggle-mode'; el.addEventListener('click', toggle); nav.appendChild(el); onLight(); } const observer = new MutationObserver(function() { if (redirected) return; const nav = document.querySelector('.notion-topbar'); const mobileNav = document.querySelector('.notion-topbar-mobile'); if (nav && nav.firstChild && nav.firstChild.firstChild || mobileNav && mobileNav.firstChild) { redirected = true; updateSlug(); addDarkModeButton(nav ? 'web' : 'mobile'); const onpopstate = window.onpopstate; window.onpopstate = function() { if (slugs.includes(getSlug())) { const page = SLUG_TO_PAGE[getSlug()]; if (page) { history.replaceState(history.state, 'bypass', '/' + page); } } onpopstate.apply(this, [].slice.call(arguments)); updateSlug(); }; } }); observer.observe(document.querySelector('#notion-app'), { childList: true, subtree: true, }); const replaceState = window.history.replaceState; window.history.replaceState = function(state) { if (arguments[1] !== 'bypass' && slugs.includes(getSlug())) return; return replaceState.apply(window.history, arguments); }; const pushState = window.history.pushState; window.history.pushState = function(state) { const dest = new URL(location.protocol + location.host + arguments[2]); const id = dest.pathname.slice(-32); if (pages.includes(id)) { arguments[2] = '/' + PAGE_TO_SLUG[id]; } return pushState.apply(window.history, arguments); }; const open = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function() { arguments[1] = arguments[1].replace('${MY_DOMAIN}', 'www.notion.so'); return open.apply(this, [].slice.call(arguments)); }; </script>${CUSTOM_SCRIPT}`, { html: true } ); } } async function appendJavascript(res, SLUG_TO_PAGE) { return new HTMLRewriter() .on("title", new MetaRewriter()) .on("meta", new MetaRewriter()) .on("head", new HeadRewriter()) .on("body", new BodyRewriter(SLUG_TO_PAGE)) .transform(res); }  
      Tem alguma coisa de errado?
    • By MarcosAntonio
      Boa tarde !
      estou carregando um arquivo texto numa variável BLOB e preciso manipular em loop, para ler linha a linha e aplicar os SUBSTRs para inserir no banco, mas não sei como fazer o loop, a interação entre as linhas e quando saber o momento de sair do loop, alguém pode me ajudar?

      ex do conteúdo do BLOB:
       
      2AAA02012021123421
      2AAA02012021213453
      2AAA02012021105413
       
      quero por exemplo retirar a informação da linha 2 a partir do quarto caracter e parando no decimo segundo caracteres
    • By Motta
      Oracle is moving its headquarters from Silicon Valley to Austin, Texas
    • By Thiago Btos
      Boa tarde galera.
       
      Fiz um select que tras 4 informações do banco (matricula, nome, data e hora)
      SELECT QD1_MAT, RA_NOME, QD1_DTBAIX AS DATA, QD1_HRBAIX FROM QD1010 QD1 INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*' ORDER BY QD1_DTBAIX, QD1_HRBAIX Retornando os seguintes registros:

       
       
       
      Preciso retornar somente as linhas em amarelo, que seria a seguinte condição.
      Caso tiver alguma matricula igual, trazer somente o registro com a maior data, junto com seu respectivo horário.
       
       
      O mais próximo que consegui chegar foi utilizando o MAX para data e hora, e agrupando o restante dos campos.
      SELECT QD1_MAT,RA_NOME,MAX(DATA), MAX(QD1_HRBAIX) FROM ( SELECT QD1_MAT, RA_NOME, QD1_DTBAIX AS DATA, QD1_HRBAIX FROM QD1010 QD1 INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*' ) GROUP BY QD1_MAT,RA_NOME Porém na hora ele não pega o valor correspondente e sim o valor máximo.

       
       
      Ai estou travado nessa parte, como faço para trazer a hora corresponde sem o restante dos registros?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.