Usuário com melhor resposta
buscar todas as segunda-feira do mes

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 aquiWhen
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
adatao resultado ficaria assim
JANEIRO
SEGUNDA
5
12
19
26
abs. WAgner
Respostas
-
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.entrySe puder não esqueça de classificar a resposta como respondida e marque-a como útil
[ ]s,
Gustavo Maia Aguiar
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 ALLSELECT
1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALLSELECT
4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALLSELECT
7 UNION ALL SELECT 8 UNION ALL SELECT 9)INSERT
INTO @TSELECT
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(FROM
@T
WHERE
Data >= '20090101' AND Data < '20090201'Experimente trocar os intervalos ou os dias da semana (segunda-feira é 2)
[ ]s,
Gustavo Maia Aguiar
-
Wagner,
Veja este exemplo:
Code SnippetCREATE
TABLE [dbo].[Data](
[Data] [datetime] NULL)
ON [PRIMARY]Declare
@Contador SmallIntSet
@Contador=1While
@Contador <31 BeginSet @Contador=@Contador + 1
EndSelect
'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
DataWhere
Datepart(Weekday,data)=2 -
Wagner,
Realizei uma pequena alteração:
Code SnippetCREATE TABLE [dbo].[Data]
(
[Data] [datetime] NULL)
ON [PRIMARY]Declare
@Contador SmallIntSet
@Contador=1While
@Contador <31 BeginSet @Contador=@Contador + 1
EndSelect
'Janeiro', Day(Data) As Segundafrom
DataWhere
Datepart(Weekday,data)=2 -
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 smalldatetimeset
@data = '01/02/2009'declare
@mes smalldatetimeset
@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
Data1Where
Datepart(Weekday,data)=@dataand
Datepart(Weekday,month(data))=@mes -
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 ALLSELECT
1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALLSELECT
4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALLSELECT
7 UNION ALL SELECT 8 UNION ALL SELECT 9)INSERT
INTO @TSELECT
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 @TWHERE
(Data >= '20090101' AND Data < '20090201') AND DATEPART(weekday, Data + @@DATEFIRST) = 2[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
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 N2abs.Wagner
-
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.entrySe puder não esqueça de classificar a resposta como respondida e marque-a como útil
[ ]s,
Gustavo Maia Aguiar