none
Consultar registros com um valor ou outro RRS feed

  • Pergunta

  • É o seguinte galera...

    estou precisando validar umas horas trabalhadas no bd, dai se o usuário trabalhar entre 08:00:00  as 12:00:00

    e depois incluir entre as '8' e as '12' EX.: 09:00:00 as 11:00:00  tenho que bloquear, dai preciso verificar se as horas passadas

    pelo usuário já foram inseridas fora do período já existente.

    ja tentei buscar com between com <= e ate agora nada

    segue o que tentei :

    --primeira tentativa
    
    select *
    from dbo.Apropriacao 
    where Data = '2013-04-10' 
    and id = '11110' 
    and SUBSTRING(HoraInicial, 1, 2) <= '08' 
    and SUBSTRING(Horafinal, 1, 2) <= '08' and SUBSTRING(Horafinal, 1, 2) <= '09'
    
    
    
    
    --segunda tentativa
    
    
    select SUBSTRING(HoraInicial, 1, 2) as hi, SUBSTRING(Horafinal, 1, 2) as hf from dbo.Apropriacao 
    where Data = '$hj' and id = '$ID'
    	  and 	SUBSTRING(HoraInicial, 1, 2) >= '$hi' 
    	  and   SUBSTRING(Horafinal, 1, 2) <= '$hf'
    
    
    
    

    quarta-feira, 10 de abril de 2013 13:43

Respostas

  • Louco,

    Segue um exemplo com dia e hora separado.

    --Create table with old data
    DECLARE @t1 TABLE
    (
    	Id_Funcionario	INT,
    	InicioData	VARCHAR(100),
    	InicioHora	VARCHAR(100),
    	FimData	VARCHAR(100),
    	FimHora	VARCHAR(100)
    )
    
    --Old data
    INSERT INTO @t1(Id_Funcionario, InicioData, InicioHora, FimData, FimHora) VALUES
    (1, '20130101', '08:00:00', '20130101', '17:00:00')
    
    --Tentativa de insert sem sucesso pois o valor passado colide com um dado ja informado
    DECLARE @Id_Usuario	INT
    DECLARE @Dia VARCHAR(100)
    DECLARE @Inicio	VARCHAR(100)
    DECLARE @Fim	VARCHAR(100)
    
    
    SET @Id_Usuario = 1
    SET @Dia = '20130101'
    SET @Inicio = '16:30:00'
    SET @Fim = '20:00:00'
    
    IF(EXISTS(
    	SELECT TOP 1 1
    	FROM @t1
    	WHERE Id_Funcionario = @Id_Usuario
    		AND InicioData = @Dia AND FimData = @Dia
    		AND ((SUBSTRING(@Inicio, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)) OR (SUBSTRING(@Fim, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante'
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui'
    END
    GO
    
    
    --Create table with old data
    DECLARE @t1 TABLE
    (
    	Id_Funcionario	INT,
    	InicioData	VARCHAR(100),
    	InicioHora	VARCHAR(100),
    	FimData	VARCHAR(100),
    	FimHora	VARCHAR(100)
    )
    
    --Old data
    INSERT INTO @t1(Id_Funcionario, InicioData, InicioHora, FimData, FimHora) VALUES
    (1, '20130101', '08:00:00', '20130101', '17:00:00')
    
    --Tentativa de insert sem sucesso pois o valor passado colide com um dado ja informado
    DECLARE @Id_Usuario	INT
    DECLARE @Dia VARCHAR(100)
    DECLARE @Inicio	VARCHAR(100)
    DECLARE @Fim	VARCHAR(100)
    
    
    SET @Id_Usuario = 1
    SET @Dia = '20130101'
    SET @Inicio = '18:00:00'
    SET @Fim = '20:00:00'
    
    IF(EXISTS(
    	SELECT TOP 1 1
    	FROM @t1
    	WHERE Id_Funcionario = @Id_Usuario
    		AND InicioData = @Dia AND FimData = @Dia
    		AND ((SUBSTRING(@Inicio, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)) OR (SUBSTRING(@Fim, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante'
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui'
    END
    GO

    Qualquer duvida favor reportar, voce esta se pendendo em algum momento nos seus dados ai.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta louco82 quarta-feira, 10 de abril de 2013 18:30
    quarta-feira, 10 de abril de 2013 18:02
    Moderador

Todas as Respostas

  • Louco82,

    Não entendi sua duvida, poderia descrever um pouco melhor com os dados exemplificados?


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 10 de abril de 2013 13:44
    Moderador
  • é assim...

    o sistema que tenho o usuário registra o inicio e o fim de seu trabalho

    tipo 08:00:00 as 11:00:00 dai quando o usuário for inserir novamente 

    o horário dele não permitir ele incluir entre esse horário já preenchido

    dai tenho que fazer uma consulta com a hora inicial e hora final que ele

    passar novamente se foi dentro desse período.

    estou tentando assim 

    select SUBSTRING(HoraInicial, 1, 2) as HI, SUBSTRING(Horafinal, 1, 2) as HF
    from dbo.Apropriacao 
    where Data = '2013-04-10' 
    and id = '11110' 
    and SUBSTRING(HoraInicial, 1, 2) <= '06' 
    and SUBSTRING(Horafinal, 1, 2) >= '09' 


    quarta-feira, 10 de abril de 2013 13:58
  • Louco,

    Segue um exemplo de logica em relação aos seus dados.

    --Create table with old data
    DECLARE @t1 TABLE
    (
    	Id_Funcionario	INT,
    	Inicio	DATETIME,
    	Fim	DATETIME
    )
    
    --Old data
    INSERT INTO @t1(Id_Funcionario, Inicio, Fim) VALUES
    (1, '20130101 08:00:00', '20130101 17:00:00')
    
    --Tentativa de insert sem sucesso pois o valor passado colide com um dado ja informado
    DECLARE @Id_Usuario	INT
    DECLARE @Inicio	DATETIME
    DECLARE @Fim	DATETIME
    
    SET @Id_Usuario = 1
    SET @Inicio = '20130101 16:30:00'
    SET @Fim = '20130101 20:00:00'
    
    IF(EXISTS(
    	SELECT TOP 1 1
    	FROM @t1
    	WHERE Id_Funcionario = @Id_Usuario
    		AND ((@Inicio BETWEEN Inicio AND Fim) OR (@Fim BETWEEN Inicio AND Fim))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante'
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui'
    END
    GO
    
    --Create table with old data
    DECLARE @t1 TABLE
    (
    	Id_Funcionario	INT,
    	Inicio	DATETIME,
    	Fim	DATETIME
    )
    
    --Old data
    INSERT INTO @t1(Id_Funcionario, Inicio, Fim) VALUES
    (1, '20130101 08:00:00', '20130101 17:00:00')
    
    --Tentativa de insert com sucesso
    DECLARE @Id_Usuario	INT
    DECLARE @Inicio	DATETIME
    DECLARE @Fim	DATETIME
    
    SET @Id_Usuario = 1
    SET @Inicio = '20130101 17:30:00'
    SET @Fim = '20130101 20:00:00'
    
    IF(EXISTS(
    	SELECT TOP 1 1
    	FROM @t1
    	WHERE Id_Funcionario = @Id_Usuario
    		AND ((@Inicio BETWEEN Inicio AND Fim) OR (@Fim BETWEEN Inicio AND Fim))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante'
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui'
    END


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 10 de abril de 2013 14:11
    Moderador
  • Bom demais essa forma como vc fez, mas se eu add mais uma clausula que seria a data ele não retorna nada...

    e só deixar mais chato o campo HoraInicial e HoraFinal estão como texto !!!

    mas a sua ajuda me deu um rumo que vou tentar aki

    ex:

    IF(EXISTS(
    	SELECT TOP 1 *
    	FROM dbo.Apropriacao 
    	WHERE id = '11110' 
    		AND Data = '2013-04-10' 
    		AND ((SUBSTRING(HoraInicial, 1, 2) BETWEEN '08' AND '09') OR (SUBSTRING(Horafinal, 1, 2) BETWEEN '08' AND '09'))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante' AS ERRO
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui' AS OK
    END
    GO


    • Editado louco82 quarta-feira, 10 de abril de 2013 14:54
    quarta-feira, 10 de abril de 2013 14:49
  • Não entendi, o que seria adicionar mais uma clausula?

    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 10 de abril de 2013 15:55
    Moderador
  • sim sim

    pelo campo do BD horaInicial e horaFinal ser varchar tenho que usar a data

    dai quando coloco a data ele nao retorna nada.

    segue a adaptação que fiz:

    IF(EXISTS(
    	SELECT  *
    	FROM dbo.Apropriacao 
    	WHERE id = '11110' 
    		AND Data = '2013-04-10' 
    		AND ((SUBSTRING(HoraInicial, 1, 2) BETWEEN '08' AND '09') OR (SUBSTRING(Horafinal, 1, 2) BETWEEN '08' AND '09'))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante' AS ERRO
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui' AS OK
    END
    GO
    

    quarta-feira, 10 de abril de 2013 16:35
  • Louco,

    O que quer dizer com não retorna nada? Uma vez que estamos trabalhando com IF...ELSE em algum deles com certeza ele vai cair, qual o retorno efetivo? Ou sua duvida é que voce esta vendo um valor que deveria conflitar no horario e não esta conflitando? Neste caso poste umas 2~3 linhas de seus dados (De forma identada, cuidado ao colar aqui) para que eu possa te ajudar melhor.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 10 de abril de 2013 16:47
    Moderador
  • O problema q quando rodo so o select 

    SELECT  *
    FROM dbo.Apropriacao 
    WHERE id = '11110' 
    AND Data = '2013-04-10' 
    AND ((SUBSTRING(HoraInicial, 1, 2) BETWEEN '08' AND '09') OR (SUBSTRING(Horafinal, 1, 2) BETWEEN '08' AND '09'))

    ele não me traz nada 

    agora se retirar o campo data ele retorna as horas que tenho

    dai com isso fica sempre :

    BEGIN
    SELECT 'Sucesso, coloque seu insert aqui' AS OK
    END

    quarta-feira, 10 de abril de 2013 17:30
  • Louco,

    Desculpa cara, não estou entendendo rs...

    Se seu select nao retorna nada é por que os horario passados não são conflitantes e deveriam realmente cair no else aonde voce substituira o select vigente por seu insert. Agora, o seu problema é que apesar de o select nao retornar nada, ele deveria retornar? olhando os dados puro na tabela com um SELECT * FROM Tabela...


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 10 de abril de 2013 17:38
    Moderador
  • é o seguinte 

    eu queria fazer uma consulta onde pegasse o intervalo de horas que tenho ex: 

    Hora Inicial Hora Fina


    07:00:00 10:00:00

    e ao usuario passar o intervalo dele, se incluso nesse período  eu retornaria um alerta


    quarta-feira, 10 de abril de 2013 17:43
  • Mas é exatamente o que meu script esta fazendo rs...

    A unica questão é que voce separou os campos de data e hora, o que não tem problema nenhum  e esta certinho em relação ao codigo que voce postou acima. Ou seja, se não esta retornando é por que o horario passado não é conflitante com nenhum existente e o insert poderá ser realizado com sucesso!


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 10 de abril de 2013 17:44
    Moderador
  • COMO TE FALEI 

    SE ADD A CONSULTA O CAMPO DATA

    MESMO ELE ESTANDO NO PERIODO ELE RETORNA

    Sucesso, coloque seu insert aqui

    quarta-feira, 10 de abril de 2013 17:51
  • Louco,

    Segue um exemplo com dia e hora separado.

    --Create table with old data
    DECLARE @t1 TABLE
    (
    	Id_Funcionario	INT,
    	InicioData	VARCHAR(100),
    	InicioHora	VARCHAR(100),
    	FimData	VARCHAR(100),
    	FimHora	VARCHAR(100)
    )
    
    --Old data
    INSERT INTO @t1(Id_Funcionario, InicioData, InicioHora, FimData, FimHora) VALUES
    (1, '20130101', '08:00:00', '20130101', '17:00:00')
    
    --Tentativa de insert sem sucesso pois o valor passado colide com um dado ja informado
    DECLARE @Id_Usuario	INT
    DECLARE @Dia VARCHAR(100)
    DECLARE @Inicio	VARCHAR(100)
    DECLARE @Fim	VARCHAR(100)
    
    
    SET @Id_Usuario = 1
    SET @Dia = '20130101'
    SET @Inicio = '16:30:00'
    SET @Fim = '20:00:00'
    
    IF(EXISTS(
    	SELECT TOP 1 1
    	FROM @t1
    	WHERE Id_Funcionario = @Id_Usuario
    		AND InicioData = @Dia AND FimData = @Dia
    		AND ((SUBSTRING(@Inicio, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)) OR (SUBSTRING(@Fim, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante'
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui'
    END
    GO
    
    
    --Create table with old data
    DECLARE @t1 TABLE
    (
    	Id_Funcionario	INT,
    	InicioData	VARCHAR(100),
    	InicioHora	VARCHAR(100),
    	FimData	VARCHAR(100),
    	FimHora	VARCHAR(100)
    )
    
    --Old data
    INSERT INTO @t1(Id_Funcionario, InicioData, InicioHora, FimData, FimHora) VALUES
    (1, '20130101', '08:00:00', '20130101', '17:00:00')
    
    --Tentativa de insert sem sucesso pois o valor passado colide com um dado ja informado
    DECLARE @Id_Usuario	INT
    DECLARE @Dia VARCHAR(100)
    DECLARE @Inicio	VARCHAR(100)
    DECLARE @Fim	VARCHAR(100)
    
    
    SET @Id_Usuario = 1
    SET @Dia = '20130101'
    SET @Inicio = '18:00:00'
    SET @Fim = '20:00:00'
    
    IF(EXISTS(
    	SELECT TOP 1 1
    	FROM @t1
    	WHERE Id_Funcionario = @Id_Usuario
    		AND InicioData = @Dia AND FimData = @Dia
    		AND ((SUBSTRING(@Inicio, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)) OR (SUBSTRING(@Fim, 0, 3) BETWEEN SUBSTRING(InicioHora, 0, 3) AND SUBSTRING(FimHora, 0, 3)))
    )
    )
    BEGIN
    	SELECT 'Erro, horario conflitante'
    END
    ELSE
    BEGIN
    	SELECT 'Sucesso, coloque seu insert aqui'
    END
    GO

    Qualquer duvida favor reportar, voce esta se pendendo em algum momento nos seus dados ai.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta louco82 quarta-feira, 10 de abril de 2013 18:30
    quarta-feira, 10 de abril de 2013 18:02
    Moderador
  • Cara o pau todo é que o campo data esta como varchar

    dai quando comparava o o "=" ele não foi

    dai coloquei o "like" funcionou !!!

    valeu mesmo pela força 

    Que Deus te abençoe muito por essa ajuda toda que me deste 

    quarta-feira, 10 de abril de 2013 18:31