Comment returnner uniquement la date à partir d'un type de données SQL Server DateTime

SELECT GETDATE() 

Retours: 2008-09-22 15:24:13.790

Je veux cette partie de date sans la partie de time: 2008-09-22 00:00:00.000

Comment puis-je l'get?

Sur SQL Server 2008 et supérieur, vous devez convertir à ce jour:

 SELECT CONVERT(date, getdate()) 

Sur les anciennes versions, vous pouvez effectuer les opérations suivantes:

 SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date)) 

par exemple

 SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

Donne moi

 2008-09-22 00:00:00.000 

Avantages:

  • Aucune conversion varchar <-> datetime requirejse
  • Pas besoin de penser à la localization

SQLServer 2008 a maintenant un type de données 'date' qui contient uniquement une date sans composant heure. Toute personne utilisant SQL Server 2008 et les versions ultérieures peut effectuer les opérations suivantes:

 SELECT CONVERT(date, GETDATE()) 

Si vous utilisez SQL 2008 et plus:

 select cast(getdate() as date) 

DATEADD et DATEDIFF sont meilleurs que CONVERTing en varchar. Les deux requêtes ont le même plan d'exécution, mais les plans d'exécution concernent principalement les stratégies d'access aux données et ne révèlent pas toujours les coûts implicites impliqués dans le time CPU nécessaire pour exécuter toutes les pièces. Si les deux requêtes sont exécutées sur une table avec des millions de lignes, l'heure du processeur en utilisant DateDiff peut être proche de 1/3 du time CPU Convert!

Pour voir les plans d'exécution des requêtes:

 set showplan_text on GO 

DATEADD et DATEDIFF exécuteront un CONVERT_IMPLICIT.

Bien que la solution CONVERT soit plus simple et plus lisible pour certains, elle est plus lente. Il n'est pas nécessaire de renvoyer vers datetime (ceci est implicitement effectué par le server). Il n'y a pas non plus de besoin réel dans la méthode DateDiff pour DateAdd, car le résultat entier sera également implicitement converti en datetime.


SELECT CONVERT (varchar, MyDate, 101) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101))) |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable])) 

SELECT DATEADD (jj, 0, DATEDIFF (jj, 0, MyDate)) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0)))) |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable])) 

L'utilisation de FLOOR () comme suggéré par @digi a des performances plus proches de DateDiff, mais n'est pas recommandée car la conversion du type de données datetime en float et back ne donne pas toujours la valeur d'origine.

Rappelez-vous les gars: Ne croyez personne. Regardez les statistics de performance, et testez vous-même!

Soyez prudent lorsque vous testez vos résultats. La sélection de nombreuses lignes pour le client masquera la différence de performance car il faut plus de time pour envoyer les lignes sur le réseau que pour effectuer les calculs. Assurez-vous donc que le travail pour toutes les lignes est effectué par le server, mais qu'aucun set de lignes n'est envoyé au client.

Il semble y avoir de la confusion pour certaines personnes à propos de l'optimization du cache qui affecte les requêtes. L'exécution de deux requêtes dans le même lot ou dans des lots séparés n'a aucun effet sur la caching. Vous pouvez donc soit expirer le cache manuellement, soit simplement exécuter les requêtes plusieurs fois. Toute optimization pour la requête n ° 2 affecterait également les requêtes suivantes, donc jetez l'exécution n ° 1 si vous le souhaitez.

Voici un script de test complet et des résultats de performance qui prouvent que DateDiff est sensiblement plus rapide que la conversion en varchar.

 SELECT CONVERT(VARCHAR(10),GETDATE(),111) 
 SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)) 

Pour le return au format de date

CAST (OrderDate AS date)

Le code ci-dessus fonctionnera dans SQL Server 2010

Il reviendra comme 12/12/2013

Pour SQL Server 2012, utilisez le code ci-dessous

 CONVERT(VARCHAR(10), OrderDate , 111) 

Vous pouvez utiliser la fonction CONVERT pour returnner uniquement la date. Voir le lien (s) ci-dessous:

Manipulation de la date et de l'heure dans SQL Server 2000

CAST et CONVERT

La syntaxe pour utiliser la fonction de conversion est:

 CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

En utilisant FLOOR () – il suffit de couper la partie time.

 SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) 

SI vous voulez utiliser CONVERT et get la même sortie que dans la question originale posée, c'est-à-dire, aaaa-mm-jj alors utilisez CONVERT(varchar(10),[SourceDate as dateTime],121) même code que les réponses précédentes , mais le code à convertir en aaaa-mm-jj avec des tirets est 121.

Si je peux get une seconde sur ma sortingbune, ce type de formatting n'appartient pas au niveau des données , et c'est pourquoi cela n'a pas été possible sans des «astuces» stupides jusqu'à SQL Server 2008 lorsque les types de données datepart sont introduit. Faire de telles conversions dans le niveau des données est une énorme perte de charge sur votre SGBD, mais plus important encore, la seconde que vous faites quelque chose comme ça, vous avez essentiellement créé des données orphelines en memory que je suppose que vous returnnerez ensuite à un programme. Vous ne pouvez pas le replacer dans une autre colonne 3NF + ou le comparer à tout ce qui a été typé sans revenir à la version précédente. Tout ce que vous avez fait est d'introduire des points d'échec et de supprimer la reference relationnelle.

Vous devez TOUJOURS aller de l'avant et renvoyer votre type de données dateTime au programme appelant et dans le niveau PRESENTATION, faire les ajustements nécessaires. Dès que vous allez convertir des choses avant de les renvoyer à l'appelant, vous supprimez tout espoir d'intégrité référentielle de l'application. Cela empêcherait une opération UPDATE ou DELETE, à nouveau, sauf si vous effectuez une sorte de réversion manuelle, ce qui expose à nouveau vos données à l'erreur humaine / code / gremlin lorsque cela n'est pas nécessaire.

 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011 
 SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0) SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE())) SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101)) 

Edit: Les deux premières methods sont essentiellement les mêmes et surpassent la méthode convert to varchar.

  Convert(nvarchar(10), getdate(), 101) ---> 5/12/14 Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014 

Pour get le résultat indiqué, j'utilise la command suivante.

 SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE())) 

Je holpe c'est utile.

Si vous avez besoin de résultat dans le type de données varchar, vous devez passer par

 SELECT CONVERT(DATE, GETDATE()) --2014-03-26 SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26 

qui est déjà mentionné ci-dessus

Si vous avez besoin de résultat dans le format de la date et de l'heure, vous devez passer par l'une des requêtes ci-dessous

1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) tant que OnlyDate –2014-03-26 00: 00: 00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) tant que OnlyDate –2014-03-26 00: 00: 00.000

3)

  DECLARE @OnlyDate DATETIME SET @OnlyDate = DATEDIFF(DD, 0, GETDATE()) SELECT @OnlyDate AS OnlyDate 

–2014-03-26 00: 00: 00.000

Si vous utilisez SQL Server 2012 ou versions supérieures ,

Utilisez la fonction Format() .

Il existe déjà plusieurs réponses et types de formatting pour le server SQL. Mais la plupart des methods sont quelque peu ambiguës et il vous serait difficile de vous souvenir des nombres pour le type de format ou les fonctions en ce qui concerne le format de date spécifique. C'est pourquoi dans les prochaines versions de SQL Server il y a une meilleure option.

 FORMAT ( value, format [, culture ] ) 

L'option Culture est très utile, car vous pouvez spécifier la date selon vos spectateurs.

Vous devez vous callbacker d (pour les petits motifs) et D (pour les longs motifs).

1. "d" – Motif de date courte.

 2009-06-15T13:45:30 -> 6/15/2009 (en-US) 2009-06-15T13:45:30 -> 15/06/2009 (fr-FR) 2009-06-15T13:45:30 -> 2009/06/15 (ja-JP) 

2. "D" – Modèle de date longue.

 2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US) 2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU) 2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE) 

Plus d'exemples dans la requête.

 DECLARE @d DATETIME = '10/01/2011'; SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result' ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result' ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result' ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result' ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result' ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result' ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result'; US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result ---------------- ----------------------------- ------------- ------------------------------------- 10/1/2011 01/10/2011 01.10.2011 2011/10/1 US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result ---------------------------- ----------------------------- ----------------------------- --------------------------------------- Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日 

Si vous voulez plus de formats, vous pouvez aller à:

  1. Chaînes de format de date et d'heure standard
  2. Chaînes de format de date et d'heure personnalisées

Je pense que cela fonctionnerait dans votre cas:

 CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate //here date is obtained as 1990/09/25 

Si vous affectez les résultats à une colonne ou à une variable, atsortingbuez-lui le type DATE et la conversion est implicite.

 DECLARE @Date DATE = GETDATE() SELECT @Date --> 2017-05-03 

Même en utilisant l'ancien MSSQL Server 7.0, le code ici (avec la permission de ce lien ) m'a permis d'get le format de date que je cherchais à l'époque:

 PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE()) PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10) PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106) PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113) 

Il a produit cette sortie:

 1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015 1:14PM 2) Date/time in format MM-DD-YY: 02-27-15 3) Date/time in format MM-DD-YYYY: 02-27-2015 4) Date/time in format DD MON YYYY: 27 Feb 2015 5) Date/time in format DD MON YY: 27 Feb 15 6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630 

Bon, même si je suis un peu en retard :), Voici l'autre solution.

 SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME) 

Résultat

 2008-09-22 00:00:00.000 

Et si vous utilisez SQL Server 2012 et supérieur, vous pouvez utiliser la fonction FORMAT() comme ceci –

 SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') 
 DECLARE @yourdate DATETIME = '11/1/2014 12:25pm' SELECT CONVERT(DATE, @yourdate) 

pourquoi n'utilisez-vous pas DATE_FORMAT (votre_datetiem_column, '% d-% m-% Y')?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

vous pouvez changer la séquence de m, d et année en réarrangeant la partie '%d-%m-%Y'

Date (champ de la date et de l'heure) et DATE_FORMAT (date et heure, '% Y-% m-% d') les deux renvois ne datent que de la date et de l'heure

Je suis favorable à ce qui suit qui n'a pas été mentionné:

 DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime)) 

Il ne se soucie pas non plus de local ou fait un double conversion – bien que chaque 'datepart' fasse probablement des maths. Donc, il se peut que ce soit un peu plus lent que la méthode de datediff, mais pour moi c'est beaucoup plus clair. Surtout quand je veux regrouper juste l'année et le mois (mettre le jour à 1).

Rendez-vous amoureux:

 SELECT CONVERT (date, GETDATE ())
 SELECT CAST (GETDATE () comme date)

Temps:

 SELECT CONVERT (heure, GETDATE (), 114)
 SELECT CAST (GETDATE () en tant que time)

À partir de SQL Server 2012, vous pouvez le faire:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

Vous pouvez utiliser les éléments suivants pour la partie date et le formatting de la date:

DATENAME => Renvoie une string de caractères représentant la datepart spécifiée de la date spécifiée

DATEADD => La fonction DATEPART() est utilisée pour renvoyer une seule partie d'une date / heure, telle que l'année, le mois, le jour, l'heure, la minute, etc.

DATEPART => Renvoie un entier représentant la datepart spécifiée de la date spécifiée.

CONVERT() => La fonction CONVERT() est une fonction générale qui convertit une expression d'un type de données en une autre. La fonction CONVERT() peut être utilisée pour afficher datatables de date / heure dans différents formats.

 SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015' 

Cela manquait dans toutes les réponses, peut-être pas le plus efficace mais très facile à écrire et à comprendre, pas de style nécessaire, pas de fonctions de date complexes.

 SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE())))) 

Vous pouvez simplement utiliser le code ci-dessous pour get uniquement la partie date et éviter la partie time dans SQL:

 SELECT SYSDATE TODAY FROM DUAL;