web-dev-qa-db-fra.com

Comment renvoyer 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 la date sans la partie du temps: 2008-09-22 00:00:00.000

Comment puis-je l'obtenir?

1544
eddiegroves

Sur SQL Server 2008 et supérieur, vous devriez CONVERT à 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: 

  • Non varchar <-> datetime conversions requises
  • Pas besoin de penser à locale
2234
aku

SQLServer 2008 a maintenant un type de données 'date' qui ne contient qu'une date sans composant horaire. Toute personne utilisant SQLServer 2008 et au-delà peut effectuer les opérations suivantes:

SELECT CONVERT(date, GETDATE())
679
BenR

Si vous utilisez SQL 2008 et supérieur:

select cast(getdate() as date)
154
abatishchev

DATEADD et DATEDIFF valent mieux que CONVERTIR 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'accès à data et ne révèlent pas toujours les coûts implicites impliqués dans le temps CPU nécessaire à l'exécution de tous les éléments. Si les deux requêtes sont exécutées sur une table contenant des millions de lignes, le temps processeur à l'aide de DateDiff peut être voisin de 1/3 du temps de conversion du processeur!

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

set showplan_text on
GO 

DATEADD et DATEDIFF exécuteront tous deux CONVERT_IMPLICIT.

Bien que la solution CONVERT soit plus simple et plus facile à lire, elle est plus lente est. Il n'est pas nécessaire de reconvertir en date/heure (cela est implicitement fait par le serveur). De plus, la méthode DateDiff n’a pas réellement besoin de DateAdd par la suite, car le résultat entier sera également reconverti implicitement en date-heure.


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 (dd, 0, DATEDIFF (dd, 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 cela n'est pas recommandé, car la conversion du type de données datetime en "float and back" ne génère pas toujours la valeur d'origine.

Rappelez-vous les gars: Ne croyez personne. Regardez les statistiques de performances et testez-les vous-même!

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

Il semble y avoir une confusion chez certaines personnes quant au moment où l’optimisation du cache 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 mise en cache. Ainsi, vous pouvez soit expirer manuellement le cache, soit simplement exécuter les requêtes à plusieurs reprises. Toute optimisation de la requête n ° 2 aurait également une incidence sur les requêtes suivantes; par conséquent, excluez l'exécution n ° 1 si vous le souhaitez.

Voici le script de test complet et les résultats de performance qui prouvent que DateDiff est nettement plus rapide que la conversion en varchar.

70
Ricardo C

Essaye ça:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

La déclaration ci-dessus convertit votre format actuel en YYYY/MM/DD, veuillez vous référer à ce lien pour choisir votre format préférable.

41
Nescio
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
37
Cade Roux

Vous pouvez utiliser la fonction CONVERT pour ne renvoyer que la date. Voir le (s) lien (s) ci-dessous:

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

CAST and CONVERT

La syntaxe d'utilisation de la fonction convert est la suivante: 

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

Pour retourner au format de date  

CAST (OrderDate AS date)

Le code ci-dessus fonctionnera dans SQL Server 2010

Il va revenir comme 12/12/2013

Pour SQL Server 2012, utilisez le code ci-dessous

CONVERT(VARCHAR(10), OrderDate , 111)
17
Mahesh ML

Utilisation de FLOOR () - réduisez simplement le temps.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
13
DiGi
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
12
Rushda

SI vous voulez utiliser CONVERT et obtenir le même résultat que dans la question initiale, c’est-à-dire aaaa-mm-jj, utilisez CONVERT(varchar(10),[SourceDate as dateTime],121) le 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 accéder à ma tribune une seconde,ce type de formatage n'appartient pas au niveau de données, et c'est pourquoi il n'était pas possible sans "astuces" stupides jusqu'à ce que SQL Server 2008 lorsque les types de données datepart sont introduits. Réaliser de telles conversions dans la couche de données représente un gaspillage énorme de votre SGBD, mais plus important encore, dès que vous faites quelque chose comme cela, vous avez essentiellement créé des données orphelines en mémoire qui, je suppose, seront ensuite restaurées dans un programme. Vous ne pouvez pas le réintégrer dans une autre colonne 3NF + ni le comparer à un élément tapé sans revenir en arrière. Vous n'avez donc qu'à introduire les points d'échec et à supprimer les références relationnelles. 

Vous devez TOUJOURS aller de l'avant et renvoyer votre type de données dateTime au programme appelant etdans le niveau PRESENTATION, effectuez les ajustements nécessaires.Dès que vous convertissez des éléments 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, encore une fois, à moins que vous ne fassiez une sorte de réversion manuelle, ce qui expose à nouveau vos données à une erreur humain/code/gremlin quand cela n’est pas nécessaire.

11
Focusyn

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

Utilisez Format() function.

Il existe déjà plusieurs réponses et types de formatage pour SQL Server. Mais la plupart des méthodes sont quelque peu ambiguës et il vous serait difficile de vous souvenir des numéros de type de format ou de fonctions par rapport au format de date spécifique. C'est pourquoi les prochaines versions de SQL Server offrent une meilleure option.

FORMAT ( value, format [, culture ] )

L'option Culture est très utile car vous pouvez spécifier une date en fonction de vos téléspectateurs.

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

1. "d" - Modèle 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 heure standard
  2. Chaînes de format de date et heure personnalisées
10
Somnath Muluk
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 méthodes sont essentiellement les mêmes et exécutez la méthode convert to varchar.

10
Gordon Bell

Pour obtenir le résultat indiqué, j'utilise la commande suivante.

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

Je holpe c'est utile.

9
Anderson Silva

Si vous souhaitez obtenir un 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 souhaitez obtenir un format de date et d’heure, passez à l’une des requêtes ci-dessous.

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

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) as 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

9
Stephon Johns
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
8
Ankit Khetan

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
7
Art Schmidt

Ok, bien que je sois un peu en retard :), voici une 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 versions ultérieures, vous pouvez utiliser la fonction FORMAT() comme ceci -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
6
Krishnraj Rana

Je pense que cela fonctionnerait dans votre cas:

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

Même en utilisant l’ancien MSSQL Server 7.0, le code ici (grâce à this link ) me permettait d’obtenir le format de date que je recherchais à 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
5
Matt O'Brien
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
5
etni

Je favorise les suivants qui n'ont pas été mentionnés:

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

Il se moque également de la conversion locale ou de la conversion double - bien que chaque "datepart" fasse probablement des calculs. Cela peut donc être un peu plus lent que la méthode de datiff, mais pour moi, c'est beaucoup plus clair. Surtout quand je veux grouper uniquement par année et par mois (régler le jour à 1).

4
Gerard ONeill

Sur SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
4
kaub0st3r

Rendez-vous amoureux:

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

Temps:

 SELECT CONVERT (heure, GETDATE (), 114) 
 SELECT CAST (GETDATE () comme heure) 
4
Kris Khairallah

Vous pouvez simplement faire de cette façon:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Sorties en tant que:

2008-09-22 00:00:00.000

Ou simplement faire comme ceci:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Résultat:

Date Part Only
--------------
2013-07-14
3
Amar Srivastava

pourquoi n'utilisez-vous pas DATE_FORMAT (your_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éorganisant la partie '%d-%m-%Y'

3

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

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

Date (champ date et heure) et DATE_FORMAT (date et heure, '% Y-% m-% d') les deux renvoient uniquement la date à partir de la date et de l'heure 

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

Vous pouvez utiliser ce qui suit pour la partie de date et le formatage de la date:

DATENAME => Renvoie une chaîne de caractères représentant la date spécifiée de la date spécifiée.

DATEADD => La fonction DATEPART() permet de renvoyer une partie d'une date/heure, telle que l'année, le mois, le jour, l'heure, les minutes, etc.

DATEPART => Renvoie un entier qui représente la partie de date 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 un autre . La fonction CONVERT() peut être utilisée pour afficher des données de date/heure dans différents formats.

2
user1151326

Je sais que c'est vieux, mais je ne vois pas où quiconque l'aurait déclaré de cette façon. D'après ce que je peux dire, c'est la norme ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Il serait bon que Microsoft puisse également prendre en charge la variable CURRENT_DATE standard ANSI.

2
lit

Si vous utilisez SQL 2008 et supérieur: SELECT CONVERT(DATE ,GETDATE())

1
Morteza Sefidi

Essaye ça:

SELECT CONVERT(date, GETDATE()) as date
1
Rafiqul Islam

Mon approche commune pour obtenir une date sans la partie heure .. 

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
1
Spider

Si vous voulez que la date affiche 2008-09-22 00:00:00.000

alors vous pouvez l'arrondir en utilisant

SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

Cela montrera la date dans le format de la question

1
ChrisM

sélectionnez convert (getdate () en tant que daselect CONVERT (date/heure, CONVERT (date, getdate ())))

0
mokh223

vous pouvez utiliser comme ci-dessous pour différents types de sortie pour la date uniquement

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- jj/mm/aaaa

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------ mm/jj/aaaa

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

0
ankit soni
select cast(createddate as date) as derivedate from table 

createdate est votre colonne datetime, cela fonctionne pour sqlserver

0
karthik kasubha

SELECT CONVERT (date, getdate ())

0
Shiraj Momin

Vous pouvez simplement utiliser le code ci-dessous pour obtenir uniquement la partie date et éviter la partie heure en SQL:

SELECT SYSDATE TODAY FROM DUAL; 
0
Shyam Bhimani

Le moyen le plus simple serait d’utiliser: SELECT DATE(GETDATE())

0
Jithin Joy

Wow, laissez-moi compter les façons dont vous pouvez faire cela. (sans jeu de mots)

Pour obtenir les résultats souhaités dans ce format spécifiquement:

2008-09-22

Voici quelques options.

SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2  = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

Je suggérerais donc de choisir celle avec laquelle vous êtes à l'aise et d'utiliser cette méthode dans tous les tableaux.

Toutes ces options renvoient la date dans le même format. Pourquoi SQL Server a-t-il une telle redondance?

Je n'en ai aucune idée, mais c'est le cas. Peut-être que quelqu'un de plus intelligent que moi pourra répondre à cette question.

J'espère que ça aide quelqu'un.

0
Aubrey Love

Mon style

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
0
CAGDAS AYDIN