SQL Server中的日期格式和有效性

时间:2015-03-27 09:07:53

标签: sql-server date

我尝试在SQL服务器上编码以获取日期的第一个格式,然后将其转换为dd / mm / yy格式。在此之后,我还需要检查日期是否最有效,例如06-07-2015之类的情况。我怎么知道那个的格式(如果是6月7日或7月6日)并将其转换为dd / mm / yy。我还需要检查年份是否有效,这意味着日期应该小于当前年份。包括2月份的日期不得超过28,除非它是闰年。你能帮我改进一下我的代码吗?非常感谢!

       set language 'us_english'

       SET DATEFORMAT dmy
       CREATE TABLE [sample].[dbo].[EY_LFA111](
                 [MANDT] [nvarchar] (255) NULL,
                 [LIFNR] [nvarchar] (255) NULL,
                 [ERDAT] [date] NULL,
                 [ERNAM] [nvarchar] (255) NULL,
                 [MENGE] [float] NULL,
                 [WKURS] [decimal] (30,15) NULL,
                 [CPUTM] [time] NULL
        )
       insert into [sample].[dbo].[EY_LFA111](
                 [MANDT],
                 [LIFNR],
                 [ERDAT],
                 [ERNAM],
                 [MENGE],
                 [WKURS],
                 [CPUTM]
        ) 
     select
           LTRIM(RTRIM([MANDT])),
           LTRIM(RTRIM([LIFNR])),
           case 
              when ISDATE(LTRIM(RTRIM([ERDAT]))) = 1
                 AND ERDAT LIKE '[0-3][0-9].[0-1][0-9].[1-2][0-9][0-9][0-9]' 
              then LTRIM(RTRIM(CONVERT(date,[ERDAT], 103)))
           else NULL end,
           LTRIM(RTRIM([ERNAM])),
           LTRIM(RTRIM(CONVERT(float,[MENGE]))),
           LTRIM(RTRIM(CONVERT(decimal(30,15),[WKURS]))),
              case when ISDATE(LTRIM(RTRIM([CPUTM]))) = 1
                 then LTRIM(RTRIM(CONVERT(time,[CPUTM], 108)))
               else NULL end
       from [sample].[dbo].[EY_Formatted$]

1 个答案:

答案 0 :(得分:1)

试试这个。删除了许多不必要的代码,并且验证得到了改进。这个答案适用于sqlserver-2012 +

INSERT [sample].[dbo].[EY_LFA111](
            [MANDT],
            [LIFNR],
            [ERDAT],
            [ERNAM],
            [MENGE],
            [WKURS],
            [CPUTM]) 
SELECT
    LTRIM(RTRIM([MANDT])),
    LTRIM(RTRIM([LIFNR])),
    CASE WHEN TRY_CONVERT(date, [ERDAT], 103) < GETDATE()
        THEN CONVERT(date,[ERDAT], 103)
        ELSE NULL end,
    LTRIM(RTRIM([ERNAM])),
    TRY_CONVERT(float,[MENGE]),
    TRY_CONVERT(decimal(30,15),[WKURS])),
    TRY_CONVERT(time, [CPUTM])
FROM [sample].[dbo].[EY_Formatted$]