3
votes

Rechercher toutes les lignes où la colonne de date a un horodatage = 00: 00: 00.000

J'ai une table dans laquelle une colonne comme registrationDate dont le type est datetime. J'ai besoin de trouver toutes les lignes où registrationDate est l'horodatage 00: 00: 00.000. par exemple:

select * from table where registrationDate like '%00:00:00.000';

Je dois interroger quelque chose comme ci-dessous:

registrationDate: '2019-03-20 00:00:00.000'


2 commentaires

Veuillez ne pas considérer les valeurs datetime comme des chaînes. Ce ne sont pas des chaînes et LIKE ne fonctionnera pas (comme je suis sûr que vous avez déjà essayé). Ce que vous recherchez, ce sont des données dont la composante horaire est minuit.


(J'en parle dans ce message .)


5 Réponses :


3
votes
WHERE registrationDate = CONVERT(date, registrationDate);

8 commentaires

quelle date d'identité ici?


@Ishant Je ne comprends pas la question. Pouvez-vous reformuler?


J'ai besoin de quelque chose comme select * from table où registrationDate comme "'% 00: 00: 00.000";


Avez-vous essayé ce que j'ai publié au lieu d'imaginer ce qui pourrait fonctionner? Une colonne datetime n'est pas une chaîne - c'est ainsi que des outils comme Management Studio vous la présentent. LIKE ne fonctionnera pas comme vous le pensez.


si X est de type DATETIME, alors CONVERT (date, X) le convertira en type DATE, ce qui supprime la partie heure. Ensuite, comparez cela à l'original X. La DATE sera reconvertie en DATETIME en ajoutant 00: 00: 00.000 heure. Si les résultats sont égaux, alors l'original doit avoir une portion de temps 00: 00: 00.000


@DavidDubois date a une précédance inférieure à datetime . docs.microsoft.com/en-us/sql/t-sql/data-types/... . Dans l'expression d'Aaron, CONVERT (date, registrationDate) sera implicitement reconverti en datetime , mais aura donc l'heure 00: 00: 00.000 , car il a été "perdu".


Et même si cela ne correspond pas exactement à ce cas d'utilisation, certains des tests de performances réels qui montrent que cette conversion est le moyen le plus efficace de supprimer le temps de datetime et de un suivi ici .


@Larnu, je suis d'accord. Lors de la comparaison avec l'original "La DATE sera reconvertie en DATETIME".



5
votes

Vous pouvez convertir la date-heure en heure:

WHERE CAST(registrationDate AS TIME) = '00:00'


4 commentaires

@GeorgeMenoutis vous ne pouvez pas utiliser 0. Qu'est-ce qu'une heure 0? Essayez-le. Il ne sera pas converti, peu importe comment vous vous y prenez.


@Sean Lange Je pensais au type de données sous-jacent. Ceci: select case when convert (datetime, '19000101') = 0 then 1 else 0 end renvoie 1. Mais après votre commentaire, j'ai vérifié la table de conversion et j'ai remarqué que bien que la conversion des types de données numériques en datetime est possible explicitement et implicitement, la conversion en time n'est pas du tout possible. On apprend quelque chose de nouveau chaque jour.


Ouais, c'est amusant de voir comment les conversions implicites avec les types de données de date et d'heure sont si différentes.


La division se fait entre les anciens types (datetime / smalldatetime) et les nouveaux types introduits en 2008 (date / heure / datetime2 / datetimeoffset). Ce dernier a hérité de très peu de comportements implicites (le getcha le plus courant est getdate () + 1 vs sysdatetime () + 1 ).



1
votes

Voir UPDATE ci-dessous

Select * From #tbl
Where convert(VarChar(50), registrationDate, 121) Like '%00:00:00.000'

Requête

registrationDate
2019-03-20 00:00:00.000

Résultat:

Select * From #tbl
Where Cast(registrationDate As Time) = '00:00:00.0000000'

Mise à jour: si vous avez vraiment besoin d'utiliser "J'aime"

Create Table #tbl
(
registrationDate Datetime
)
Insert Into #tbl Values
('2019-03-20 00:00:00.000'),
('2019-03-20 00:00:25.000')


0 commentaires

0
votes
select * from table where FORMAT(registrationDate, 'HH:mm:ss:ms') ='00:00:00.000'

1 commentaires

FORMAT () est en fait une très mauvaise idée , surtout dans le cadre d'un scan de la table entière.



0
votes

L'expression suivante obtient pour chaque valeur datetime la date correspondante avec la partie heure:

create table foo (id int, registrationDate datetime)
insert foo values
   (1, '2019-04-04T03:22:48.00'),
   (2, '2019-04-04T00:00:00.00')
select * from foo
where registrationDate =
      dateadd(day, datediff(day, 0, registrationDate), 0)

Par conséquent, ce qui suit fera l'affaire:

dateadd(day, datediff(day, 0, '<date_time>'), 0)


0 commentaires