2009-09-30 76 views
0

使用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,它应该显示前一个日期。

如何查询这种情况?

+0

是存储在该方式中CSV一个文本列? – gbn 2009-09-30 05:53:28

回答

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

+0

工作正常,只要“怪异无效”的日期总是以“00”结尾...... – 2009-09-30 07:37:20

+0

是不是指定了什么? – 2009-09-30 08:04:41

1

好的,我没有看到日期为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)) 
+0

请你能帮我解决这个问题http://stackoverflow.com/questions/41254801/how-to-force-web-api-to-return-the-underlying-int-value-of-a-enum – eddy 2016-12-21 15:26:41

0

要显示的有效日期是很容易的:

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 

马克