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';