【问题标题】:Updating the year?更新年份?
【发布时间】:2010-02-17 10:07:11
【问题描述】:

使用 sql server 2000

日期列数据类型为 varchar

表1

ID Date 

01 20100122
01 20100123
01 20100124
01 20100125
01 20100126
01 20090127
01 20090128
01 20090129
01 20090130
01 20090131
01 20090201
01 20100202
01 20090203
01 20100204
01 20100205
02 
.....

从上表看,从 1 月 26 日到 2 月 3 日,所有 id 的年份都显示错误

我只想更新 2010 年而不是 2009 年,比如 20100127 而不是 20000127

预期输出

ID Date

01 20100126
01 20100127
...
01 20100203
...
02

查询喜欢

update table1 set 2010 instead of 2009 where date between 20090126 and 20090203

如何查询更新值。

需要查询帮助

【问题讨论】:

  • 您的日期是否存储为datetimevarchar
  • @Christian - 不是 varchar?
  • 对不起,我不明白你的意思。表中“日期”列的数据类型是否定义为datetimevarchar
  • 快速提问。您的表是否存储了格式正确的 2009 年日期?
  • "日期列数据类型是 varchar" >> 嗯,你的问题!

标签: sql-server


【解决方案1】:

如果列是 DATETIME 类型,请查看 DATEADD

SELECT GETDATE(),  DATEADD(year, 1, GETDATE())

对于 VARCHAR,您可以尝试类似

DECLARE @Table TABLE(
        Date VARCHAR(8)
)

INSERT INTO @Table SELECT '20090301'

SELECT  *
FROM    @Table

UPDATE  @Table
SET     Date = '2010' + RIGHT(Date, 4)
WHERE   LEFT(Date,4) = '2009'

SELECT *
FROM    @Table

或者类似的东西

DECLARE @Table TABLE(
        ID VARCHAR(4),
        Date VARCHAR(8)
)

INSERT INTO @Table SELECT '01','20100122'
INSERT INTO @Table SELECT '01','20100123' 
INSERT INTO @Table SELECT '01','20100124' 
INSERT INTO @Table SELECT '01','20100125' 
INSERT INTO @Table SELECT '01','20100126' 
INSERT INTO @Table SELECT '01','20090127' 
INSERT INTO @Table SELECT '01','20090128' 
INSERT INTO @Table SELECT '01','20090129' 
INSERT INTO @Table SELECT '01','20090130' 
INSERT INTO @Table SELECT '01','20090131' 
INSERT INTO @Table SELECT '01','20090201' 
INSERT INTO @Table SELECT '01','20100202' 
INSERT INTO @Table SELECT '01','20090203' 
INSERT INTO @Table SELECT '01','20100204' 
INSERT INTO @Table SELECT '01','20100205' 

UPDATE  @Table
SET     Date = '2010' + RIGHT(Date, 4)
WHERE   Date >= '20090126'
AND     Date <= '20090203'
AND     ID = '01'

SELECT  *
FROM    @Table

【讨论】:

  • @Astander - 我想设置更新 table1 之类的条件,日期在 20090126 和 20090203 之间。
【解决方案2】:

更好的方法,避免替换 9 月 20 日

UPDATE Table1 Set Date = Replace(Date, '2009', '2010') WHERE DATE LIKE '2009%'

【讨论】:

    【解决方案3】:
    UPDATE Table1 
    SET Date = Replace(Date, '2009', '2010') 
    WHERE 
        DATE LIKE '2009%' 
    AND
        convert(DATETIME, Date, 112) BETWEEN '2009-01-26 00:00:00' AND 
                                             '2009-02-03 23:59:59.999'
    

    【讨论】:

    • 在此具体示例中与此处无关,但请注意,此代码会将“20092009”(2009 年 9 月 20 日)变成“20102010”——不一定是您期望/想要的.
    • @marc_s,非常好的观点。我已经更新了我的答案,添加了一个应对这种情况的附加条款。
    【解决方案4】:

    如果列定义为varchar:

    update Table1
    set [Date] = '2010' + substring([Date], 5, 4)
    where [Date] between '20090126' and '20090203'
    

    如果列定义为datetime

    update Table1
    set [Date] = convert(datetime, '2010-' + substring([Date], 5, 2) + '-' + substring([Date], 7, 2), 120)
    where [Date] between {d'2009-01-26'} and {d'2009-02-03'}
    

    注意事项:

    • 虽然{d'yyyy-mm-dd'} 语法不是合法的 T-SQL,但它仍然可以被任何 SQL Server 客户端堆栈正确拦截和解释,例如ODBC、OLEDB、ADO.NET 等。这也适用于交互式查询工具。如果您不喜欢使用 ODBC 转义序列,可以改用 convert(datetime, 'yyyy-mm-dd', 120)
    • convert(datetime, 'yyyy-mm-dd', 120) 应用 ODBC 标准日期时间格式,该格式是文化/区域设置不变的,因此对于构造日期时间字符串非常有用,无论当前服务器区域设置如何。

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 2022-12-04
      相关资源
      最近更新 更多