none
buscar todas as segunda-feira do mes RRS feed

  • Pergunta

  •  

    Boa tarde a todos?

     

    Estou montando um select na qual irar me retorna todas a segunda feira de um mes, no oracle eu consigo fazer

    deste geito

     

    SELECT   *

    FROM (SELECT  TRUNC (SYSDATE, 'MM') + LEVEL - 1 DATA

    FROM ADATA

    CONNECT BY LEVEL <=

    (TRUNC (LAST_DAY (SYSDATE)) - TRUNC (SYSDATE, 'MM') + 1 )) dt

    WHERE TO_CHAR (DATA, 'S') = 2

    ORDER BY dt.DATA

     

    /*Entretanto no sql, a sintaxe não é a mesma e estou tentado fazer assim

     porem só consigo especificando o campo(data), como irei especificar o mes de janeiro,e dos proximos meses.

    Select Case Datepart(weekday,data)-- esse campo aqui 

    When 1 Then 'Domingo'

    When 2 Then 'Segunda - Feira'

    When 3 Then 'Terça - Feira'

    When 4 Then 'Quarta - Feira'

    When 5 Then 'Quinta - Feira'

    When 6 Then 'Sexta - Feira'

    When 7 Then 'Sábado'

    End As 'Dia da semana'

    from adata

     

    o resultado ficaria assim

         JANEIRO

         SEGUNDA

           5

           12

           19

           26

    abs. WAgner

    quinta-feira, 22 de janeiro de 2009 14:48

Respostas

Todas as Respostas

  • Boa Tarde,

     

    Segue um exemplo abaixo (acredito ser mais performático que o exemplo postado sobre o ORACLE)

     

    Code Snippet

    -- Cria uma tabela de datas

    DECLARE @T TABLE (Data SmallDateTime)

     

    -- Cadastra os 100 primeiros dias do ano de 2009

    ;WITH Nums (Num) AS (SELECT 0 UNION ALL

    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL

    SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL

    SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)

     

    INSERT INTO @T

    SELECT DATEADD(D,(N1.Num * 10) + N2.Num,'20090101')

    FROM Nums AS N1 CROSS JOIN Nums AS N2

     

    -- Conta quantas segundas-feiras existem em janeiro por exemplo

    SELECT SUM(

    CASE WHEN DATEPART(weekday, Data + @@DATEFIRST) = 2 THEN 1 ELSE 0 END)

    FROM

    @T

    WHERE Data >= '20090101' AND Data < '20090201'

     

    Experimente trocar os intervalos ou os dias da semana (segunda-feira é 2)

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    quinta-feira, 22 de janeiro de 2009 15:28
  • Wagner,

     

    Veja este exemplo:

     

    Code Snippet

    CREATE TABLE [dbo].[Data]

    (

      [Data] [datetime] NULL

     ) ON [PRIMARY]

     

     

    Declare @Contador SmallInt

     

    Set @Contador=1

     

    While @Contador <31

    Begin

     

      Insert Into Data Values (Convert(Char(10),@Contador)+'/'+Convert(Char(10),Month (GetDate()))+'/'+Convert(Char(10),Year(GetDate())))

     

      Set @Contador=@Contador + 1

    End

     

    Select

     'Janeiro', Day(Data),

      Case Datepart(weekday,Data)-- esse campo aqui

       When 1 Then 'Domingo'

       When 2 Then 'Segunda - Feira'

       When 3 Then 'Terça - Feira'

       When 4 Then 'Quarta - Feira'

       When 5 Then 'Quinta - Feira'

       When 6 Then 'Sexta - Feira'

       When 7 Then 'Sábado'

      End As 'Dia da semana'

    From Data

    Where Datepart(Weekday,data)=2

     

     

     

    quinta-feira, 22 de janeiro de 2009 15:42
  • Wagner,

     

    Realizei uma pequena alteração:

     

    Code Snippet

    CREATE TABLE [dbo].[Data]

    (

      [Data] [datetime] NULL

     ) ON [PRIMARY]

     

     

    Declare @Contador SmallInt

     

    Set @Contador=1

     

    While @Contador <31

    Begin

     

      Insert Into Data Values (Convert(Char(10),@Contador)+'/'+Convert(Char(10),Month (GetDate()))+'/'+Convert(Char(10),Year(GetDate())))

     

      Set @Contador=@Contador + 1

    End

     

    Select

    'Janeiro', Day(Data) As Segunda

    from Data

    Where Datepart(Weekday,data)=2

     

     

    quinta-feira, 22 de janeiro de 2009 15:59
  • Gustavo e Junior obrigado pela atenção

    O exemplo do Gustavo, está apenas contando quantas segunda feira eu tenho em determinado mes, entretano não retorna o principal que são os dias que caem segunda de cada mes. ex. janeiro: 5,12,19,26

     

    Já o exemplo do Junior, está retornando somente "uma" segunda feira de cada mes, e como eu disse eu quero todas as segunda feiras de um mesmo de forma dinamica.

     

    Estou fazendo desse jeito, porem está dando errado porcausa do ano bi-sexto de fevereiro, ai ele estraga toda query, pois até o dia 28/02 eu consigo trazer certo.

     

    abs.Wagner

     

     

    declare @data smalldatetime

    set @data = '01/02/2009'

    declare @mes smalldatetime

    set @mes = '01/02/2009'

    --declare @ano smalldatetime

    --set @ano = 2009

    Select

    month(@mes) as mes ,day(@data) as dia,

    Case Datepart(weekday,day(@data))-- esse campo aqui

    When 1 Then 'Domingo'

    When 2 Then 'Segunda - Feira'

    When 3 Then 'Terça - Feira'

    When 4 Then 'Quarta - Feira'

    When 5 Then 'Quinta - Feira'

    When 6 Then 'Sexta - Feira'

    When 7 Then 'Sábado'

    End As 'Dia da semana',

    'Mes' = case month(@mes)

    when '1' then 'Janeiro'

    when '2' then 'Fevereiro'

    when '3' then 'Março'

    when '4' then 'Abril'

    when '5' then 'Maio'

    when '6' then 'Junho'

    when '7' then 'Julho'

    when '8' then 'Agosto'

    when '9' then 'Setembro'

    when '10'then 'Outubro'

    when '11'then 'Novembro'

    when '12'then 'Dezembro'

    End

    From Data1

    Where Datepart(Weekday,data)=@data

    and Datepart(Weekday,month(data))=@mes

     

    sexta-feira, 23 de janeiro de 2009 16:50
  • Boa Tarde,

     

    Posso adaptá-lo. Tente fazer o seguinte:

     

    Code Snippet

    -- Cria uma tabela de datas

    DECLARE @T TABLE (Data SmallDateTime)

     

    -- Cadastra os 100 primeiros dias do ano de 2009

    ;WITH Nums (Num) AS (SELECT 0 UNION ALL

    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL

    SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL

    SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)

     

    INSERT INTO @T

    SELECT DATEADD(D,(N1.Num * 10) + N2.Num,'20090101')

    FROM Nums AS N1 CROSS JOIN Nums AS N2

     

    -- Mostra todas as segundas-feiras existem em janeiro por exemplo

    SELECT Data FROM @T

    WHERE

    (Data >= '20090101' AND Data < '20090201') AND

    DATEPART(weekday, Data + @@DATEFIRST) = 2

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    sexta-feira, 23 de janeiro de 2009 16:58
  • Cara tu é maluco mesmo .rs.r.sr.sr.sr.sr. funcionou..

    porem eu só queria que vc me explica-se o que esse select tá fazendo, pois só sei está adicionado dias rsr.rs.rs.rs.rs

     

     

    SELECT DATEADD(D,(N1.Num * 10) + N2.Num,'20090101')

    FROM Nums AS N1 CROSS JOIN Nums AS N2

     

    abs.Wagner

    sexta-feira, 23 de janeiro de 2009 18:10
  • Olá Wagner,

     

    Essa primeira parte do script não é necessária. Ela apenas adiciona os 100 primeiros dias do ano de 2009. Eu a fiz porque precisava de uma massa de testes e não estava muito disposto a gerar vários comandos de INSERT INTO.

     

    A tabela virtual Nums possui 10 registros e combiná-la com ela mesma produz 100 registros (10 x 10). O que fiz foi utilizar o DATEADD com cada um desses 100 registros para obter a seqüência de dias e popular a tabela.

     

    Como você já possui uma tabela populada, o que vai lhe interessar é apenas a consulta de SELECT com o DATEPART. Caso lhe interesse saber mais sobre essa fictícia tabela de números e sua utilidade, recomendo dar uma olhada nos artigos abaixo do meu blog.

     

    Criando uma tabela com uma seqüência de números
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!192.entry


    Seleção de datas não armazenadas
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!200.entry


    O problema dos IDs ausentes
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!201.entry

     

    Se puder não esqueça de classificar a resposta como respondida e marque-a como útil

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    sexta-feira, 23 de janeiro de 2009 18:54