SQL替换并更新日期时间字符串;在某一日期之前”;

SQL替换并更新日期时间字符串;在某一日期之前”;,sql,sql-server,string,date,replace,Sql,Sql Server,String,Date,Replace,我有一个数据字段Date,格式为yyyyMMdd字符串(varchar)。我如何在某个日期(比如20180201)之前,到某个月(比如2018年3月)替换所有内容!?只改变年份和月份,保留日期 示例:字符串20160913将更改为20180313,但20180224将保持原样,因为它在20180201之后将该字符串转换为日期以搜索大于日期的字符串,并使用子字符串提取日期部分以构建新的日期字符串 declare @NewYear varchar(4) = '2018' declare @NewMo

我有一个数据字段
Date
,格式为
yyyyMMdd
字符串(varchar)。我如何在某个日期(比如20180201)之前,到某个月(比如2018年3月)替换所有内容!?只改变年份和月份,保留日期


示例:字符串20160913将更改为20180313,但20180224将保持原样,因为它在20180201之后

将该字符串转换为日期以搜索大于日期的字符串,并使用子字符串提取日期部分以构建新的日期字符串

declare @NewYear varchar(4) = '2018'
declare @NewMonth varchar(2) = '03'
declare @PivotDate date = '2018-02-01'

update myTable set MyField = @NewYear + @NewMonth + substring(MyField, 6, 2)
where convert(date, MyField, 112) > @PivotDate

将该字符串转换为日期以搜索大于日期的日期,并使用子字符串提取日期部分以生成新的日期字符串

declare @NewYear varchar(4) = '2018'
declare @NewMonth varchar(2) = '03'
declare @PivotDate date = '2018-02-01'

update myTable set MyField = @NewYear + @NewMonth + substring(MyField, 6, 2)
where convert(date, MyField, 112) > @PivotDate

我建议这样做:

declare @NewYear varchar(4) = '2018';
declare @NewMonth varchar(2) = '03';
declare @PivotDate date = '2018-02-01';

update myTable
    set MyField = @NewYear + @NewMonth + right(MyField, 2)
where myfield < convert(varchar(255), @PivotDate, 112);
declare@NewYear varchar(4)='2018';
声明@NewMonth varchar(2)='03';
声明@PivotDate='2018-02-01';
更新myTable
设置MyField=@NewYear+@NewMonth+右侧(MyField,2)
其中myfield

此解决方案的重要部分是
where
子句。特别是,
myfield
上没有允许使用索引的函数调用。允许索引的表达式称为sargable。

我建议这样做:

declare @NewYear varchar(4) = '2018';
declare @NewMonth varchar(2) = '03';
declare @PivotDate date = '2018-02-01';

update myTable
    set MyField = @NewYear + @NewMonth + right(MyField, 2)
where myfield < convert(varchar(255), @PivotDate, 112);
declare@NewYear varchar(4)='2018';
声明@NewMonth varchar(2)='03';
声明@PivotDate='2018-02-01';
更新myTable
设置MyField=@NewYear+@NewMonth+右侧(MyField,2)
其中myfield

此解决方案的重要部分是
where
子句。特别是,
myfield
上没有允许使用索引的函数调用。允许索引的表达式称为sargable。

我建议这样做,因为如果@NewMonth<二月,则可能会出现问题

declare @NewYear varchar(4) = '2018'
declare @NewMonth varchar(2) = '02'
declare @PivotDate date = '2018-02-01'

update myTable set MyField = DATEADD(day,(right(MyField, 2)-1),cast((@NewYear + @NewMonth + '01') as date))
where convert(date, MyField, 112) > @PivotDate

谢谢大家!

我建议这样做,因为如果@NewMonth<2月,那么这可能是个问题

declare @NewYear varchar(4) = '2018'
declare @NewMonth varchar(2) = '02'
declare @PivotDate date = '2018-02-01'

update myTable set MyField = DATEADD(day,(right(MyField, 2)-1),cast((@NewYear + @NewMonth + '01') as date))
where convert(date, MyField, 112) > @PivotDate

谢谢大家!

Real
date
列没有“格式”。该列的数据类型是什么?@a_horse_,格式为yyyyMMdd string“->string/varchar/charSorry。。。这是SQL Server…不要将日期存储为strings@WhatsThePoint好。。。我同意你的看法!但这不是重点,不是吗!?有些情况下,您无法控制数据库的设计,例如,维护其他人的数据库!那么,如果日期被“储存”为字符串,我该怎么办!?谢谢你的帮助!Real
date
列没有“格式”。该列的数据类型是什么?@a_horse_,格式为yyyyMMdd string“->string/varchar/charSorry。。。这是SQL Server…不要将日期存储为strings@WhatsThePoint好。。。我同意你的看法!但这不是重点,不是吗!?有些情况下,您无法控制数据库的设计,例如,维护其他人的数据库!那么,如果日期被“储存”为字符串,我该怎么办!?谢谢你的帮助!