Data e hora do SQL Server COMO selecionar?

no MySQL

select * from record where register_date like '2009-10-10%' 

Qual é a syntax no SQL Server?

Obrigado.

Você pode usar a function DATEPART ()

 SELECT * FROM record WHERE (DATEPART(yy, register_date) = 2009 AND DATEPART(mm, register_date) = 10 AND DATEPART(dd, register_date) = 10) 

Acho isso fácil de ler, pois ignora o componente de tempo e você não precisa usar a data do dia seguinte para restringir sua seleção. Você pode ir para maior ou menor granularidade adicionando cláusulas extras, usando o código DatePart apropriado, por exemplo

 AND DATEPART(hh, register_date) = 12) 

para obter registros feitos entre 12 e 1.

Consulte os documentos do MSDN DATEPART para obter a lista completa de argumentos válidos.

Não há suporte direto para o operador LIKE em relação a variables ​​DATETIME, mas você sempre pode converter o DATETIME em um VARCHAR:

 SELECT (list of fields) FROM YourTable WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%' 

Consulte os documentos do MSDN para obter uma lista completa de “estilos” disponíveis na function CONVERT.

Marc

Se você fizer isso, estará forçando-o a fazer uma conversão de string. Seria melhor criar um período de início / término e usar:

 declare @start datetime, @end datetime select @start = '2009-10-10', @end = '2009-11-10' select * from record where register_date >= @start and register_date < @end 

Isso permitirá que ele use o índice (se houver um em register_date ), em vez de uma varredura de tabela.

Você pode usar o CONVERT para obter a data no formato de texto. Se você convertê-lo em um varchar (10), você pode usar = em vez de como:

 select * from record where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10' 

Ou você pode usar uma data limite superior e inferior, com a vantagem de poder usar um índice:

 select * from record where '2009-10-10' <= register_date and register_date < '2009-10-11' 

Infelizmente, não é possível comparar datetime para varchar usando ‘LIKE’, mas a saída desejada é possível de outra maneira.

  select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0 

Você também pode usar convert para tornar a data pesquisável usando LIKE. Por exemplo,

 select convert(VARCHAR(40),create_date,121) , * from sys.objects where convert(VARCHAR(40),create_date,121) LIKE '%17:34%' 

Há uma cobertura muito esquisita do operador LIKE para datas no SQL Server. Ele só funciona usando o formato de data americana. Por exemplo, você pode tentar:

 ... WHERE register_date LIKE 'oct 10 2009%' 

Eu testei isso no SQL Server 2005 e funciona, mas você realmente precisa experimentar combinações diferentes. Coisas estranhas que eu notei são:

  • Você só parece obter tudo ou nada para diferentes sub-campos dentro da data, por exemplo, se você procurar por ‘apr 2%’, você só recebe algo nos anos 20 – ele omite os segundos.

  • Usar um único sublinhado ‘_’ para representar um único caractere (curinga) não funciona totalmente, por exemplo, WHERE mydate LIKE 'oct _ 2010%' não retornará todas as datas antes do 10º – ele não retorna nada, na verdade!

  • O formato é rígido americano: ‘ mmm dd yyyy hh:mm

Eu achei difícil conseguir um processo para o LIKEing segundos, então se alguém quiser levar isso um pouco adiante, seja meu convidado!

Espero que isto ajude.

O operador LIKE não trabalha com partes de data como mês ou data, mas o operador DATEPART faz.

Comando para descobrir todas as contas cuja data de abertura foi no dia 1:

 SELECT * FROM Account WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1` 

* CASTING OpenDt porque seu valor é em DATETIME e não apenas em DATE .

Eu resolvi meu problema dessa maneira. Obrigado por sugestões de melhorias. Exemplo em C #

 string dd, mm, aa, trc, data; dd = nData.Text.Substring(0, 2); mm = nData.Text.Substring(3, 2); aa = nData.Text.Substring(6, 4); trc = "-"; data = aa + trc + mm + trc + dd; "Select * From bdPedidos Where Data Like '%" + data + "%'"; 

Estou um pouco atrasado para este segmento, mas na verdade há suporte direto para o operador semelhante no servidor MS SQL.

Conforme documentado na ajuda do LIKE, se o tipo de dados não for uma string, ele será tentado convertê-lo em uma string. E conforme documentado na documentação convertida:

A conversão padrão de data e hora para string é tipo 0 (, 100), que é dd dd aaaa hh: miAM (ou PM).

Se você tem uma data como esta no database:

 2015-06-01 11:52:59.057 

e você faz consultas como esta:

 select * from wws_invoice where invdate like 'Jun%' select * from wws_invoice where invdate like 'Jun 1%' select * from wws_invoice where invdate like 'Jun 1 %' select * from wws_invoice where invdate like 'Jun 1 2015:%' select * from wws_invoice where invdate like 'Jun ? 2015%' ... select * from wws_invoice where invdate like 'Jun 1 2015 11:52AM' 

você consegue essa linha.

No entanto, este formato de data sugere que é um DateTime2 e , em seguida, a documentação diz:

21 ou 121 – ODBC canônico (com milissegundos) padrão para hora, data, data e hora2 e datetimeoffset. – aaaa-mm-dd hh: mi: ss.mmm (24h)

Isso torna mais fácil e você pode usar:

 select * from wws_invoice where invdate like '2015-06-01%' 

e obtenha o registro da fatura. Aqui está um código de demonstração:

 DECLARE @myDates TABLE (myDate DATETIME2); INSERT INTO @myDates (myDate) VALUES ('2015-06-01 11:52:59.057'), ('2015-06-01 11:52:59.054'), ('2015-06-01 13:52:59.057'), ('2015-06-01 14:52:59.057'); SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01%'; SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11%'; SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59%'; SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59.054%'; 

Fazer pesquisas de data e hora no SQL Server sem nenhuma conversão em string sempre foi problemático. Obter cada parte da data é um exagero (o que provavelmente não usaria um índice). Provavelmente, uma maneira melhor quando você não usa a conversão de string seria usar verificações de intervalo. ie:

 select * from record where register_date >= '20091010' and register_date < '20091011';