我尝试在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$]
答案 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$]