sql-server yyyy Comparer une chaîne de date à datetime dans SQL Server?



sql time format (15)

Dans SQL Server, j'ai une colonne DATETIME qui inclut un élément de temps.

Exemple:

'14 AUG 2008 14:23:019'

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

Exemple: (Pas sûr, car il ne correspond pas à la partie temps et ne 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: Étant donné que ce site est aussi à noter des notes et des techniques que vous ramasser puis 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.

Mettre à jour l' exemple clarifié pour être plus précis.

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

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

@wearejimbo: Fermer, mais pas de cigare! badge attribué à vous. Vous avez raté des records écrits au 14/08/2008 23: 59: 001 à 23: 59: 999 (ie Moins d'une seconde avant minuit.)


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


SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'

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

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


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)

Dans sqlserver

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime[email protected]p_date

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


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

Cependant, si vous ne faites souvent que des recherches sur des DATE ranges DATE ou DATE ranges spécifiques, la meilleure solution que je trouve est d'ajouter à votre table une autre colonne calculée persistante qui ne contiendrait que la DATE et ajouterait un index sur cette colonne:

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

Ajouter un index sur 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

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

Quelque chose comme ça?

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

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 trouverez que cette solution s'adapte bien. Regardez le plan d'exécution de la requête de votre requête d'origine.

Et pour moi :


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)

Je convertis normalement la date et l'heure et 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

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 du format "AAAA-MM-JJ".

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


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

Je sais que ce n'est pas exactement ce que vous voulez faire, mais ça 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'

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

L'un des moyens les plus rapides et les plus simples de le faire est d'utiliser

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

Cela évite que le processeur ne casse la logique en "convertissant la date en une chaîne sans le temps, puis en la convertissant de nouveau".

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

Obtenez la date du premier jour du mois

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

Obtenez la date rfom il y a 1 an

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

SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp




datetime