Sql server SQL server中的日期格式和有效性

Sql server SQL server中的日期格式和有效性,sql-server,date,Sql Server,Date,我正在尝试在SQL server上编写代码,以获取日期的第一个格式,然后将其转换为dd/mm/yy格式。之后,我还需要检查日期是否有效,特别是在诸如2015年7月6日之类的情况下。我如何知道该文件的格式(如果是6月7日或7月6日),并将其转换为dd/mm/yy。我还需要检查年份是否有效,这意味着日期应该小于当前年份。包括2月的日期不得大于28,除非是闰年。你能帮我改进代码吗?非常感谢你 set language 'us_english' SET DATEFORMAT

我正在尝试在SQL server上编写代码,以获取日期的第一个格式,然后将其转换为dd/mm/yy格式。之后,我还需要检查日期是否有效,特别是在诸如2015年7月6日之类的情况下。我如何知道该文件的格式(如果是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$]

试试这个。许多不必要的代码被删除,验证也得到了改进。这个答案在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$]
插入[sample].[dbo].[EY_LFA111](
[MANDT],
[LIFNR],
[ERDAT],
[ERNAM],
[梦歌],,
[WKURS],
[CPUTM])
挑选
LTRIM(RTRIM([MANDT]),
LTRIM(RTRIM([LIFNR]),
尝试转换时的大小写(日期,[ERDAT],103)
如果您使用的是SQL Server 2012或更高版本,请尝试解析可能会对您有所帮助。我使用的是SQLServer2008RTM,代码不起作用。TRY\u CONVERT甚至不能识别为内置函数名。请问有什么帮助吗?嗨,t-clausen.dk。我使用的是SQLServer2008RTM,代码不起作用。TRY\u CONVERT甚至不能识别为内置函数名。请问有什么需要帮忙的吗?