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
.
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)
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.
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 .
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)
SELECT GETDATE(),
CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
Soustrayez la milliseconde de la date. (Ou ajoutez une valeur négative de milliseconde)
SELECT DATEADD(ms, -DATEPART(ms, GETDATE()), GETDATE())
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 =