2008-08-14 10 views
37

Dans SQL Server, j'ai une colonne DATETIME qui inclut un élément de temps.Comparer une chaîne de date à datetime dans SQL Server?

Exemple:

'14 AUG 2008 14:23:019' 

Quelle est la méthode mieux pour sélectionner uniquement les enregistrements pour un jour donné, en ignorant la partie de temps?

Exemple: (pas sûr, car il ne correspond pas à la partie de temps et retourne aucune ligne)

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime = @p_date 

Note: Compte tenu de ce site est aussi griffonner des notes et des techniques que vous prenez et oublier , Je vais poster ma propre réponse à cette question car DATETIME stuff dans MSSQL est probablement le sujet que je recherche le plus dans SQLBOL.


Mise à jour exemple Clarifiée pour être plus précis.


Modifier Désolé, mais j'ai eu des réponses WRONG down-mod (réponses qui renvoient des résultats erronés).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') retournera le 13 et le 14.

@wearejimbo: Fermer, mais pas de cigare! un badge qui vous est attribué. Vous avez manqué des documents écrits au 14/08/2008 23: 59: 001 à 23: 59: (.-À-dire moins de 1 seconde avant minuit) 999

Répondre

35

Technique 1:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime >= @p_date 
AND  column_datetime < DATEADD(d, 1, @p_date) 

L'avantage de cette est qu'il utilisera n'importe quel index sur 'column_datetime' s'il existe.

+11

Je crois que CAST ('14 août 2008' comme DateTime) est légèrement mieux. Je pense que c'est un peu plus lisible et je crois que CAST est plus portable que CONVERT() en ce que CAST() est compatible avec ANSI SQL-92 et -99 –

+1

Vous pouvez utiliser le mot-clé BETWEEN comme raccourci pour cette réponse. –

+1

@BorhanMooz, en fait, le BETWEEN ne saisit pas l'intervalle> =/ NargothBond

1
SELECT * 
FROM table1 
WHERE CONVERT(varchar(10),columnDatetime,121) = 
     CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121) 

Cela va convertir le DataTime et la chaîne en varchars du format "AAAA-MM-JJ".

Ceci est très laid, mais devrait fonctionner

4

Technique 2:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE DATEDIFF(d, column_datetime, @p_date) = 0 

Si le champ column_datetime n'est pas indexé, et est peu susceptible d'être (ou l'indice est peu susceptible d'être utilisé) puis L'utilisation de DATEDIFF() est plus courte.

8

Il suffit de comparer les valeurs de l'année, du mois et du jour.

Declare @DateToSearch DateTime 
Set @DateToSearch = '14 AUG 2008' 

SELECT * 
FROM table1 
WHERE Year(column_datetime) = Year(@DateToSearch) 
     AND Month(column_datetime) = Month(@DateToSearch) 
     AND Day(column_datetime) = Day(@DateToSearch) 
3

Cette fonction Ensemble (Ch (Ensemble (GetDate() As Float)) Comme DateTime) renvoie un type de données datetime avec la portion de temps enlevé et pourrait être utilisé comme si.

Select 
* 
Table1 
Where 
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008' 

ou

DECLARE @p_date DATETIME 
SET  @p_date = Cast('14 AUG 2008' as DateTime) 

SELECT * 
FROM  table1 
WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date 
+0

Les fonctions multiples appliquées au champ (si indexées) ne le convertissent-elles pas en un balayage de table complet? –

1

Je sais que ce n'est pas exactement comment vous voulez faire cela, mais il pourrait être un début:

SELECT * 
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
     DATEPART(mm, column_dateTime) as Month, 
     DATEPART(dd, column_dateTime) as Day 
     FROM table1) 
WHERE Year = '2008' 
AND Month = '8' 
AND Day = '14' 
4

Quelque chose comme ça?

SELECT * 
FROM table1 
WHERE convert(varchar, column_datetime, 111) = '2008/08/14' 
14

Dans SQL Server 2008, vous pouvez utiliser la nouvelle date datatype

DECLARE @pDate DATE='2008-08-14' 

SELECT colA, colB 
FROM table1 
WHERE convert(date, colDateTime) = @pDate 

@Guy. Je pense que vous trouverez que cette solution s'adapte bien. Jetez un oeil à la query execution plan de votre requête d'origine.

Et pour mine:

3

Comment obtenir la partie DATE d'un champ DATETIME dans MS SQL Server:

L'un des plus rapides et les moyens les plus jolis pour ce faire est d'utiliser

DATEADD(dd, DATEDIFF(dd, 0, @DAY), 0) 

Il évite que le CPU ne casse la "conversion de la date en une chaîne sans le temps et ensuite la conversion".

Il n'expose pas non plus l'implémentation interne que la "partie temps est exprimée en fraction" de la date.

Obtenir la date du premier jour du mois

DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0) 

Obtenir la date RFOM il y a 1 an

DATEADD(m,-12,DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0)) 
0
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp 
1
DECLARE @Dat 

SELECT * 
FROM Jai 
WHERE                           
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                
      CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+    
        CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat 
4

Bon point sur l'indice dans la réponse, vous avez accepté.

encore, si vous recherchez vraiment que sur des questions spécifiques DATE ou DATE rangessouvent, alors la meilleure solution que je trouve est d'ajouter une autre persista colonne calculée à votre table qui ne contient que le DATE, et ajoutez index sur cette colonne:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED 

index Ajouter dans cette colonne:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci" 
ON "table1" ("column_date" ASC) 
GO 

Ensuite, votre recherche sera encore plus rapide:

DECLARE @p_date DATE 
SET  @p_date = CONVERT(DATE, '14 AUG 2008', 106) 

SELECT * 
FROM  table1 
WHERE column_date = @p_date 
+0

puis, je suggère d'utiliser l'un des formats ISO pour les dates que la plupart des bases de données reconnaissent et ne dépend pas de la langue/de l'environnement local, comme "AAAA-MM-JJ" – van

-1

SQLServer

DECLARE @p_date DATE 

SELECT * 
FROM table1 
WHERE [email protected]_date 

En C# passer le courte chaîne de valeur de date en utilisant la fonction ToShortDateString(). exemple: DateVariable.ToShortDateString();

1

La date peut être comparée dans sqlserver à l'aide de la comparaison de chaînes: par exemple.

DECLARE @strDate VARCHAR(15) 
SET @strDate ='07-12-2010' 


SELECT * FROM table 
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112) 
0
SELECT * FROM tablename 
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012' 
3

je convertir normalement date-heure à ce jour et de les comparer, comme ceux-ci:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date) 

ou

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0 
0

La meilleure façon est d'extraire simplement la partie date en utilisant le SQL DATE() Fonction:

SELECT * 
FROM table1 
WHERE DATE(column_datetime) = @p_date; 
0

Il existe de nombreux formats de date en SQL qui sont spécifiés. Référence https://msdn.microsoft.com/en-in/library/ms187928.aspx

Conversion et comparaison de la colonne varchar avec les dates sélectionnées.

Syntaxe:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03' 
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy 
Questions connexes