Question

Dans SQL Server, j'ai un DATETIME colonne qui comprend un élément temporel.

Exemple:

'14 AUG 2008 14:23:019'

Quel est le meilleur méthode pour sélectionner uniquement les enregistrements d'un jour particulier, en ignorant la partie horaire ?

Exemple:(Pas sûr, car il ne correspond pas à la partie temporelle et ne renvoie aucune ligne)

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

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

Note:Étant donné que ce site consiste également à noter des notes et des techniques que vous prenez puis oubliez, je vais publier ma propre réponse à cette question, car les éléments DATETIME dans MSSQL sont probablement le sujet que je recherche le plus dans SQLBOL.


Mise à jour Exemple clarifié pour être plus précis.


Modifier Désolé, mais j'ai dû modifier les mauvaises réponses (réponses qui renvoient des résultats erronés).

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

@wearejimbo : Fermer, mais pas de cigare ! badge qui vous a été décerné.Vous avez manqué des enregistrements rédigés le 14/08/2008 entre 23:59:001 et 23:59:999 (c'est-à-direMoins d'une seconde avant minuit.)

Était-ce utile?

La solution

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 est qu'il utilisera n'importe quel index sur 'column_datetime' s'il existe.

Autres conseils

Dans SQL Server 2008, vous pouvez utiliser le nouveau type de données DATE

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

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

@Gars.Je pense que vous constaterez que cette solution évolue très bien.Jetez un oeil à plan d'exécution des requêtes de votre requête initiale.

Et pour le mien:

Comparez simplement 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)

Quelque chose comme ça?

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

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 qu'il est peu probable qu'il le soit (ou qu'il est peu probable que l'index soit utilisé), alors l'utilisation de DATEDIFF() est plus courte.

Bon point sur l'index dans la réponse que vous avez acceptée.

Pourtant, si vous recherchez réellement uniquement des éléments spécifiques DATE ou DATE ranges souvent, alors la meilleure solution que j'ai trouvée est d'ajouter une autre colonne calculée persistante à votre table qui ne contiendrait que le DATE, et ajoutez un index sur cette colonne :

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

Ajoutez un index sur cette colonne :

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

Votre recherche sera alors encore plus rapide :

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

SELECT   *
FROM     table1
WHERE    column_date = @p_date

Cette fonction Cast(Étage(Cast(GetDate() As Float)) As DateTime) renvoie un type de données datetime avec la partie heure supprimée et peut être utilisé comme tel.

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

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

L’un des moyens les plus rapides et les plus efficaces d’y parvenir consiste à utiliser

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

Cela évite la logique de "convertir la date en chaîne sans l'heure, puis de la reconvertir" qui détruit le processeur.

Il n’expose pas non plus l’implémentation interne selon laquelle « la partie horaire est exprimée sous forme de fraction » de la date.

Obtenez la date du premier jour du mois

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

Obtenez la date d'il y a 1 an

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

Je convertis normalement la date-heure en date et je les compare, comme ceci :

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

Je sais que ce n'est pas exactement ainsi que vous voulez procéder, mais cela 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'
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

Cela convertira le datatime et la chaîne en varchars au format "AAAA-MM-JJ".

C'est très moche, mais ça devrait marcher

La date peut être comparée dans sqlserver en utilisant 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)
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

La meilleure façon est d'extraire simplement la partie date à l'aide de la fonction SQL DATE() :

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

Il existe de nombreux formats de date en SQL qui sont spécifiés.Référer 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

Dans SQLServer

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

En C # passez la courte chaîne de valeur de date à l'aide de la fonction TOSHORTDATESTRING ().échantillon:DateVariable.ToShortDateString();

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top