web-dev-qa-db-fra.com

Omettre les millisecondes dans une date

Lorsque je sélectionne à partir de SQL Server, je veux obtenir une date, mais omettre la valeur en millisecondes, et je veux que ce soit un type de date. Donc, si j'ai une valeur 1/1/2009 1:23:11.923, Je veux omettre la milliseconde mais conserver le type de date, afin que ce soit la valeur 1/1/2009 1:23:11.000 (Je sais que vous ne pouvez vraiment pas omettre la valeur en millisecondes avec une date, je veux juste que ce soit zéro).

Existe-t-il une fonction dans SQL Server pour ce faire? Ou dois-je écrire ma propre fonction? Encore une fois, je ne veux pas que ce soit un type varchar, mais un type datetime.

27
Brian Mains

Si vous ne souhaitez pas utiliser de conversions de chaînes, voici une solution:

DECLARE @TheDate datetime, @Today datetime
SET @TheDate = GetDate()

SET @Today = DateAdd(dd, DateDiff(dd, 0, @TheDate), 0)
SELECT DateAdd(s, DateDiff(s, @Today, @TheDate), @Today)
9
Amy B

Utilisation DATETIME2, un nouveau type de données dans SQL Server 2008 qui prend en charge la précision fractionnelle:

SELECT
  CONVERT(DATETIME2(0),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss]
, CONVERT(DATETIME2(1),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.f]
, CONVERT(DATETIME2(2),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ff]
, CONVERT(DATETIME2(3),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fff]
, CONVERT(DATETIME2(4),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffff]
, CONVERT(DATETIME2(5),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffff]
, CONVERT(DATETIME2(6),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffffff]
, CONVERT(DATETIME2(7),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffffff]

La conversion sera arrondie à l'unité la plus proche, par exemple:

2014-09-04 09:35:47.0162993 as DATETIME2(4) -> 
2014-09-04 09:35:47.0163

Alternativement, sur SQL 2005 et eariler:

SELECT
  original  = GETDATE()
, [floor]   = DATEADD(ms,-DATEPART(ms,GETDATE()),GETDATE())
, [ceiling] = DATEADD(ms,1000-DATEPART(ms,GETDATE()),GETDATE())
, [rounded] = DATEADD(ms,CASE WHEN DATEPART(ms,GETDATE()) < 500 THEN 0 ELSE 1000 END-DATEPART(ms,GETDATE()),GETDATE())

C'est un peu plus rapide que la conversion vers et depuis une représentation sous forme de chaîne.

52
Peter Radocchia

Utilisation:

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(19), GETDATE(), 120))

Ce:

CONVERT(VARCHAR(19), GETDATE(), 120)

... omet les millisecondes, renvoyant un VARCHAR. Vous convertissez/convertissez cela en DATETIME afin de travailler avec le type de données souhaité.

Voir ce lien pour une liste des différents formats de date/heure avec lesquels vous pouvez travailler .

11
OMG Ponies

essaye ça

 declare @DATE datetime
 select @DATE = '1/1/2009 1:23:11.923'



 SELECT convert(datetime,CONVERT(char(35),@DATE,120))

ou avec des fonctions de date uniquement

DECLARE @DATE DATETIME
SELECT @DATE = '1/1/2009 1:23:11.923'

SELECT DATEADD(SECOND, DATEDIFF(SECOND, 39000, @DATE), 39000)
6
SQLMenace
SELECT  GETDATE(),
        CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
4
Quassnoi

Soustrayez la milliseconde de la date. (Ou ajoutez une valeur négative de milliseconde)

SELECT DATEADD(ms, -DATEPART(ms, GETDATE()), GETDATE()) 

De SQL Server supprime les millisecondes de datetime

3
Lijo
DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)

Il peut être nécessaire de changer le 0 en autre chose pour éviter une erreur de débordement. Vous n'avez pas de serveur SQL à portée de main pour vérifier.

Bien que cette méthode ne semble pas intuitive à première vue, jetez un œil ici pour la justification derrière elle: http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes =

2
Frank Kalis