2010-02-11 5 views
22

Lorsque je sélectionne à partir de SQL Server, je veux obtenir une date, mais omettre la valeur millisecondes, et je veux qu'il soit comme 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, de sorte que ce sera la valeur 1/1/2009 1:23:11.000 (Je sais que vous ne pouvez vraiment pas omettre la valeur de milliseconde avec une date, je veux juste qu'il soit zéro).Omettre les millisecondes dans une date

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

Répondre

9

Si vous ne souhaitez pas utiliser les 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) 
+0

Cela fonctionne parfaitement sans arrondir aux secondes. M'a aidé. Merci :) –

+0

Pour ceux qui cherchent une réponse sans millisecondes partie alors ce n'est pas pour vous, Cela donne '000' en millisecondes, vous pouvez essayer l'approche de @Peter Radocchia. Si vous êtes d'accord avec '000' c'est parfait pour vous. Mais mieux c'est mieux – Gaurravs

4
SELECT GETDATE(), 
     CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120) 
+0

est-ce pas la ', 120' sur le CONVERT externe redondant? –

+0

@OMGPonies: mise à jour de l'un avec l'autre :) – Quassnoi

+0

le style de format CONVERT (120) est ignoré lors de la conversion d'une chaîne en date/heure. BOL dit: _le style du format de date utilisé pour convertir les données datetime ou smalldatetime en données de type caractère (types de données nchar, nvarchar, char, varchar, nchar ou nvarchar); ou le format de chaîne utilisé pour convertir les données float, real, money ou smallmoney en données de type caractère (types de données nchar, nvarchar, char, varchar, nchar ou nvarchar). Lorsque style est NULL, le résultat retourné est également NULL. –

10

Utilisation:

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

Ce:

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

... Omet les millisecondes, un retour VARCHAR. Donc vous CAST/CONVERT que dans un DATETIME afin de travailler avec le type de données désiré.

Voir this link for a list of various date/time formats you can work with.

+0

Convertir un nombre en chaîne, puis revenir à nouveau est très inefficace. Utilisez les fonctions datetime fournies dans SQL – TFD

6

essayer cette

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



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

ou avec les fonctions de date ne

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

SELECT DATEADD(SECOND, DATEDIFF(SECOND, 39000, @DATE), 39000) 
+0

Convertir nombre en chaîne, puis revenir à nouveau est très inefficace. Utilisez les fonctions datetime fournies dans SQL – TFD

+0

vous obtiendrez un débordement avec des millisecondes – SQLMenace

+1

Tout ce que vous avez à faire est de soustraire les millisecondes avec DATEADD(). Aucun ajout de 0 requis. –

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

devrez peut-être changer le 0 à autre chose pour éviter une erreur de débordement. Ne disposez pas d'un serveur SQL à portée de main pour vérifier.

Bien que cette méthode ne semble pas être intuitive à première vue, un coup d'oeil ici pour les raisons derrière: http://www.karaszi.com/SQLServer/info_datetime.asp#GettingRidOfTimePortion

EDIT: voir les commentaires

+0

Frank, je pense que vous voulez SECOND, pas MILLISECOND. –

+0

Lol. Bonne prise, Aaron. Changé. –

43

Utilisez 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 arrondit à l'unité la plus proche, par exemple:

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

Sinon, 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 à partir d'une représentation de chaîne .

+1

Wow, c'est génial, mais malheureusement, SQL Server 2005 :-( –

+0

Ajout d'une version SQL 2005. –

+1

Brian, j'ai supprimé la balise SQL Server 2008. Si vous avez besoin d'une solution qui ne fonctionne que sur 2005, vous –

Questions connexes