Sql e评论“上面的答案”,由于stackoverflow的性质,我们的答案四处浮动。我不希望我的答案被驳回,因为它超出了其他人的评论,即“上面的答案”有问题。:)您好,感谢您的帖子,,,我不知道为什么我会收到“从字符串转换日期和/或时间时转换失败”。当我尝试将
Sql e评论“上面的答案”,由于stackoverflow的性质,我们的答案四处浮动。我不希望我的答案被驳回,因为它超出了其他人的评论,即“上面的答案”有问题。:)您好,感谢您的帖子,,,我不知道为什么我会收到“从字符串转换日期和/或时间时转换失败”。当我尝试将,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,e评论“上面的答案”,由于stackoverflow的性质,我们的答案四处浮动。我不希望我的答案被驳回,因为它超出了其他人的评论,即“上面的答案”有问题。:)您好,感谢您的帖子,,,我不知道为什么我会收到“从字符串转换日期和/或时间时转换失败”。当我尝试将此应用到主表时出错;(有什么想法吗?我把所有字段都定义为datatype Date。在SQL 2008 R2上运行时没有错误。我将用一个精选的示例更新我的帖子,也许这会对这个问题有所帮助。当我运行它时,从varchar到Date的最终转换是一个
e评论“上面的答案”,由于stackoverflow的性质,我们的答案四处浮动。我不希望我的答案被驳回,因为它超出了其他人的评论,即“上面的答案”有问题。:)您好,感谢您的帖子,,,我不知道为什么我会收到“从字符串转换日期和/或时间时转换失败”。当我尝试将此应用到主表时出错;(有什么想法吗?我把所有字段都定义为datatype Date。在SQL 2008 R2上运行时没有错误。我将用一个精选的示例更新我的帖子,也许这会对这个问题有所帮助。当我运行它时,从varchar到Date的最终转换是一个错误…不是查询的应用程序…在我的表中,我能够运行到我需要的位置。)t将日期转换为varchar,给我YYYY-M-DD,表示月份中只有一个数字的日期。这是否会导致在最后一步将其转换为日期格式时出现问题?我无法将其转换为日期格式。对于我提供的示例,我使用您的代码没有问题…我所有的日期字段也是数据类型date。@millhouse,请您验证一下莱恩:我的答案怎么了?我不明白你说的:“其他关于上述答案不正确的帖子是在页面上答案顺序不同时写的”@FLICKER我不是在评论你的答案。我是在评论一个不同的答案做出了评论“上述答案”由于stackoverflow的性质,我们的答案四处浮动。我不希望我的答案被驳回,因为它落在其他人的评论之上,即“上面的答案”有问题。:)
Birth_date purchase_date Birth_date_update
2002-02-21 2006-05-11 2007-02-21
2004-01-18 2004-01-25 2005-01-18
2011-07-24 2011-04-09 2011-07-24
2006-12-16 2007-10-08 2007-12-16
2007-04-30 2008-03-14 2008-04-30
update my_table
set birth_date_update = case
when birth_date > purchase_date then birth_date -- Condition 1
when birth_date < purchase_date then dateadd(year, datediff(year, birth_date, purchase_date), birth_date) -- Condition 2
when dateadd(year, datediff(year, birth_date, purchase_date), purchase_date) < purchase_date
then dateadd(year, 1, dateadd(year, datediff(year, birth_date, purchase_date), purchase_date)) end -- Condition 3
create table TAB1 (BD date, PD date, BDU date)
insert into TAB1 values
('2002-02-21', '2006-05-11', NULL),
('2004-01-18', '2004-01-25', NULL),
('2011-07-24', '2011-04-09', NULL),
('2006-12-16', '2007-10-08', NULL),
('2007-04-30', '2008-03-14', NULL)
;with cc as (
select BD, PD,
case
when BD > PD then BD
when BD < PD then cast(cast(year(PD) as varchar) + '-' + cast(month(BD) as varchar) + '-' + cast(day(BD) as varchar) as date)
end as BDU
from TAB1
)
, cc2 as (
select BD, PD,
case
when BDU < PD then dateadd(day, 365, BDU)
else BDU
end as BDU
from cc
)
update T1
set BDU = cc2.BDU
from TAB1 T1
inner join cc2 on cc2.BD = T1.BD and cc2.PD = T1.PD
select * from TAB1
UPDATE dbo.BirthDateTable SET Birth_date_update =
CASE WHEN Birth_date >= purchase_date THEN Birth_date -- Condition 1
WHEN Birth_date < purchase_date
THEN CASE
WHEN CONVERT(Date , CAST( DATEPART(YEAR,purchase_date) AS Varchar(4)) + '-' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)) + '-' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2))) > purchase_date
THEN CONVERT(Date , CAST( DATEPART(YEAR,purchase_date) AS Varchar(4)) + '-' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)) + '-' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2))) -- Condition 2
ELSE DATEADD(YEAR,1,CONVERT(Date , CAST( DATEPART(YEAR,purchase_date ) AS Varchar(4)) + '-' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)) + '-' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2)))) -- Condition 3
END
END
SELECT
CASE WHEN Birth_date >= purchase_date THEN Birth_date -- Condition 1
WHEN Birth_date < purchase_date
THEN CASE
WHEN CONVERT(Date , CAST( DATEPART(YEAR,purchase_date) AS Varchar(4)) + '-' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)) + '-' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2))) > purchase_date
THEN CONVERT(Date , CAST( DATEPART(YEAR,purchase_date) AS Varchar(4)) + '-' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)) + '-' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2))) -- Condition 2
ELSE DATEADD(YEAR,1,CONVERT(Date , CAST( DATEPART(YEAR,purchase_date ) AS Varchar(4)) + '-' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)) + '-' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2)))) -- Condition 3
END
END
FROM dbo.BirthDateTable
SELECT
CASE WHEN Birth_date >= purchase_date THEN Birth_date
WHEN Birth_date < purchase_date
THEN CASE
WHEN CONVERT(Date , CAST( DATEPART(YEAR,purchase_date) AS Varchar(4)) + '-' + RIGHT('00' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)),2) + '-' + RIGHT('00' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2)),2)) > purchase_date
THEN CONVERT(Date , CAST( DATEPART(YEAR,purchase_date) AS Varchar(4)) + '-' + RIGHT('00' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)),2) + '-' + RIGHT('00' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2)),2))
ELSE DATEADD(YEAR,1,CONVERT(Date , CAST( DATEPART(YEAR,purchase_date ) AS Varchar(4)) + '-' + RIGHT('00' + CAST(DATEPART(MONTH,Birth_date) AS Varchar(2)),2) + '-' + RIGHT('00' + CAST(DATEPART(DAY, Birth_date) AS Varchar(2)),2)))
END
END AS CalcDate
FROM dbo.BirthDateTable