【问题标题】:How to modify the date column values?如何修改日期列值?
【发布时间】:2009-09-30 05:48:54
【问题描述】:

使用 SQL Server 2000,日期列数据类型为 varchar...

在我的表中日期列值是这样的:

2009/01/31
2009/02/00
2009/02/01....
2009/03/31
2009/04/00
2009/04/01.... so on...,

我想显示 2009/01/31 而不是 2009/02/00,如果日期是 2009/02/00,它应该显示上一个日期。

如何查询这个条件?

【问题讨论】:

  • 是否以 CSV 格式存储在文本列中?

标签: sql sql-server tsql sql-server-2000


【解决方案1】:

试试这个怎么样

DECLARE @Table TABLE(
        Val VARCHAR(10)
)

INSERT INTO @Table (Val) SELECT '2009/01/31'
INSERT INTO @Table (Val) SELECT '2009/02/00'

SELECT * FROM @Table

SELECT  CAST(SUBSTRING(Val, 1, 8) + CASE WHEN SUBSTRING(Val, 9, 2) = '00' THEN '01' ELSE SUBSTRING(Val, 9, 2) END AS DATETIME) + CASE WHEN SUBSTRING(Val, 9, 2) = '00' THEN -1 ELSE 0 END
FROM    @Table

检查最后一个字符是否为00,然后设置为01并添加-1

【讨论】:

  • 这不是指定的吗?
【解决方案2】:

好的,我没有看到日期以 00 作为日期部分的事实。

我用这种蛮力的方式鞭打了。

我确信可以应用一些优化,但这应该为您提供一个起点。

select dateadd(dd, -1, convert(datetime, case when substring(Reverse(@WeirdDate), 1, 2) = '00' then reverse('1' + substring(Reverse(@WeirdDate), 2, len(@WeirdDate) - 1)) else @WeirdDate end, 101))

用列名替换@WeirdDate,它似乎工作

declare @WeirdDate varchar(10)
set @WeirdDate = '2009/04/00'
select dateadd(dd, -1, convert(datetime, case when substring(Reverse(@WeirdDate), 1, 2) = '00' then reverse('1' + substring(Reverse(@WeirdDate), 2, len(@WeirdDate) - 1)) else @WeirdDate end, 101))

set @WeirdDate = '2009/04/03'
select dateadd(dd, -1, convert(datetime, case when substring(Reverse(@WeirdDate), 1, 2) = '00' then reverse('1' + substring(Reverse(@WeirdDate), 2, len(@WeirdDate) - 1)) else @WeirdDate end, 101))

set @WeirdDate = '2009/01/00'
select dateadd(dd, -1, convert(datetime, case when substring(Reverse(@WeirdDate), 1, 2) = '00' then reverse('1' + substring(Reverse(@WeirdDate), 2, len(@WeirdDate) - 1)) else @WeirdDate end, 101))

【讨论】:

【解决方案3】:

显示有效日期非常简单:

SELECT  
   CASE ISDATE(datecolumn) 
     WHEN 1 THEN CAST(datecolumn AS DATETIME) 
     ELSE NULL 
   END  AS 'DateValue'
FROM
  dbo.YourTable

但是处理像'2009/02/00'这样的无效日期有点棘手.....

但既然你似乎已经有了前一个日期 (2009/01/31) - 你就不能忽略无效的日期吗???

SELECT  
   CAST(datecolumn AS DATETIME) 
FROM
   dbo.YourTable
WHERE
   ISDATE(datecolumn) = 1

马克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2022-11-28
    • 2021-10-20
    • 2012-04-22
    相关资源
    最近更新 更多