2009-09-04 8 views

Répondre

2

Quelque chose comme cela devrait fonctionner:

insert into TableName(DateColumn) 
select convert(datetime,getDate(),103) 
+1

121 est aaaa-mm-jj – pjp

+0

@pjp: Donc, il est maintenant corrigé. –

+0

+1 - La fonction de conversion devrait faire ce dont vous avez besoin. –

1

Je ne suis pas sûr que je suis tout à fait, mais si vous prenez un datetime de la forme 'jj/mm/aa' et j'essaie de l'obtenir dans un varchar(10) du formulaire yyyy-dd-mm alors je pense yo u'll besoin de se convertir à un varchar puis utilisez SUBSTRING, LEFT et RIGHT pour retirer les données dont vous avez besoin:

declare @dt datetime 
select @dt = getdate() -- i.e. 04/09/2009 

declare @str varchar(8) 
select @str = convert(varchar(8),@dt,112) --gives 20090904 
select LEFT(@str,4) + '-' + RIGHT(@str,2) + '-' + SUBSTRING(@str,5,2) -- gives 2009-04-09 

Il est pas joli, mais ça marche!

+0

Je préférerais aller pour une fonction de formatage de date plus générale que le piratage du format au cas par cas :) – pjp

0

Jetez un oeil à cette fonction de formatage de date personnalisé à partir http://anubhavg.wordpress.com/2009/06/11/how-to-format-datetime-date-in-sql-server-2005/

Cela vous permet de formater les dates de toute façon que vous voulez. Cependant je ne suis pas sûr pourquoi vous voudriez une date dans le format YYYY-DD-MM car c'est plutôt non-standard.

———— 
– SQL datetime functions 
– SQL Server date formats 
– T-SQL convert dates 
– Formatting dates sql server 

CREATE FUNCTION dbo.fnFormatDate (@Datetime DATETIME, @FormatMask VARCHAR(32)) 
RETURNS VARCHAR(32) 
AS 
BEGIN 
    DECLARE @StringDate VARCHAR(32) 
    SET @StringDate = @FormatMask 
    IF (CHARINDEX ('YYYY',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'YYYY', 
         DATENAME(YY, @Datetime)) 

    IF (CHARINDEX ('YY',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'YY', 
         RIGHT(DATENAME(YY, @Datetime),2)) 

    IF (CHARINDEX ('Month',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'Month', 
         DATENAME(MM, @Datetime)) 

    IF (CHARINDEX ('MON',@StringDate COLLATE SQL_Latin1_General_CP1_CS_AS)>0) 
     SET @StringDate = REPLACE(@StringDate, 'MON', 
         LEFT(UPPER(DATENAME(MM, @Datetime)),3)) 

    IF (CHARINDEX ('Mon',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'Mon', 
            LEFT(DATENAME(MM, @Datetime),3)) 

    IF (CHARINDEX ('MM',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'MM', 
        RIGHT('0'+CONVERT(VARCHAR,DATEPART(MM, @Datetime)),2)) 

    IF (CHARINDEX ('M',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'M', 
         CONVERT(VARCHAR,DATEPART(MM, @Datetime))) 

    IF (CHARINDEX ('DD',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'DD', 
         RIGHT('0'+DATENAME(DD, @Datetime),2)) 

    IF (CHARINDEX ('D',@StringDate) > 0) 
     SET @StringDate = REPLACE(@StringDate, 'D', 
            DATENAME(DD, @Datetime)) 

RETURN @StringDate 
END 

Ensuite, vous pouvez appeler ceci: SELECT dbo.fnFormatDate (getdate(), 'YYYY-DD-MM')

+0

+1 Pour effort pur - gentil! – butterchicken

+0

Hmm wars de vote ... jeux amusants enfants ... S'il vous plaît laissez des commentaires avec des notes down. – pjp

0

Nous ne savons pas si YY en DD/MM/YY est dans le siècle en cours ou siècle précédent. Par exemple, si YY est 15, nous ne savons pas si c'est 1915 ou 2015. Donc les nombres entre 0 et 15 seront traités comme siècle actuel. Si l'année en cours est 2016, alors les nombres entre 0 et 16 seront traités comme siècle actuel (sa dynamique).

EXEMPLE

  • Lorsque YY est 15, alors YYYY seront 2015.
  • Lorsque YY est 97, alors YYYY sera 1997.

QUERY

DECLARE @DATECOL VARCHAR(13) = '25/01/15' 


SELECT CASE WHEN RIGHT(@DATECOL,2) BETWEEN 0 AND CAST(RIGHT(YEAR(GETDATE()),2)AS INT) 
THEN '20' + RIGHT(@DATECOL,2) ELSE '19' + RIGHT(@DATECOL,2) END 
+ '-' + LEFT(@DATECOL,2) + '-' + LEFT(RIGHT(@DATECOL,5),2) 
Questions connexes