web-dev-qa-db-fra.com

SQL Server datetime LIKE sélectionner?

en MySQL

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

Quelle est la syntaxe dans SQL Server?

85
Paisal

Vous pouvez utiliser la fonction DATEPART ()

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

Je trouve cette méthode facile à lire, car elle ignore la composante heure et vous n'avez pas à utiliser la date du lendemain pour limiter votre sélection. Vous pouvez atteindre une granularité plus ou moins grande en ajoutant des clauses supplémentaires, en utilisant le code DatePart approprié, par exemple.

AND    DATEPART(hh, register_date) = 12)

obtenir des enregistrements entre 12 et 1.

Consultez le MSDN DATEPART docs pour obtenir la liste complète des arguments valides.

128
Ralph Lavelle

Il n'y a pas de support direct pour l'opérateur LIKE contre les variables DATETIME, mais vous pouvez toujours convertir le DATETIME en VARCHAR:

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

Consultez MSDN docs pour obtenir une liste complète des "styles" disponibles dans la fonction CONVERT.

Marc

54
marc_s

Si vous faites cela, vous le forcez à effectuer une conversion de chaîne. Il serait préférable de créer une plage de dates de début/fin et d’utiliser:

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

Cela lui permettra d’utiliser l’index (s’il en existe un sur register_date) plutôt qu’un scan de table.

10
Marc Gravell

Vous pouvez utiliser CONVERT pour obtenir la date sous forme de texte. Si vous le convertissez en varchar (10), vous pouvez utiliser = au lieu de:

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

Ou vous pouvez utiliser une date limite supérieure et inférieure, avec l'avantage supplémentaire de pouvoir utiliser un index:

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

Malheureusement, il n'est pas possible de comparer datetime avec varchar en utilisant 'LIKE', mais la sortie souhaitée est possible d'une autre manière.

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

Vous pouvez également utiliser convert pour rendre la date consultable à l'aide de LIKE. Par exemple,

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

L'opérateur LIKE ne fonctionne pas avec des éléments de date comme le mois ou la date, mais l'opérateur DATEPART.

Commande pour trouver tous les comptes dont la date d'ouverture était le 1er:

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

* CASTING OpenDt car sa valeur est dans DATETIME et pas seulement DATE.

2
Mohit Sarin

Je suis un peu en retard sur ce fil, mais en fait, il existe un support direct pour le même opérateur dans MS SQL Server.

Comme indiqué dans l'aide de LIKE, si le type de données n'est pas une chaîne, il est tenté de le convertir en chaîne. Et comme indiqué dans la documentation cast\convert:

la conversion de date/heure par défaut en chaîne est de type 0 (, 100), qui est mon jj aaaa hh: miAM (ou PM).

Si vous avez une date comme celle-ci dans la base de données:

2015-06-01 11:52:59.057

et vous faites des requêtes comme ceci:

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'

vous obtenez cette ligne.

Cependant, ce format de date suggère qu'il s'agit d'un DateTime2, alors la documentation dit:

21 ou 121 - ODBC) canonical (avec millisecondes) par défaut pour l'heure, la date, le datetime2 et le datetimeoffset. - aaaa-mm-jj hh: mi: ss.mmm (24h)

Cela facilite les choses et vous pouvez utiliser:

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

et obtenir l'enregistrement de la facture. Voici un code de démonstration:

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

Effectuer des recherches par date/heure sur le serveur SQL sans conversion en chaîne a toujours été problématique. Obtenir chaque partie de date est une perte de temps (qui utiliserait probablement un index). Une meilleure façon de ne pas utiliser la conversion de chaîne serait probablement d'utiliser des contrôles de plage. c'est à dire:

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

Il existe une couverture très floconneuse de l'opérateur LIKE pour les dates dans SQL Server. Cela fonctionne uniquement avec le format de date américain. A titre d'exemple, vous pouvez essayer:

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

J'ai testé cela dans SQL Server 2005 et cela fonctionne, mais vous devrez vraiment essayer différentes combinaisons. Les choses étranges que j'ai remarquées sont:

  • Vous semblez n'obtenir que tout ou rien pour différents sous-champs dans la date, par exemple, si vous recherchez "apr 2%", vous n'obtenez rien dans les 20e - il omet les champs 2eme.

  • L'utilisation d'un simple trait de soulignement '_' pour représenter un seul caractère (caractère générique) ne fonctionne pas entièrement, par exemple, WHERE mydate LIKE 'oct _ 2010%' retournera pas toutes les dates avant le 10 - il ne retourne rien du tout, en fait!

  • Le format est américain rigide: 'mmm dd yyyy hh:mm '

J'ai eu du mal à mettre au point un processus pendant des secondes, alors si quelqu'un veut aller un peu plus loin, soyez mon invité!

J'espère que cela t'aides.

1
Paul

J'ai résolu mon problème de cette façon. Merci pour les suggestions d'améliorations. Exemple en 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 + "%'";
0
Eronildo Barbosa