Comparer une chaîne de date à datetime dans SQL Server ?
-
08-06-2019 - |
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.)
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();