2009-09-30 98 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 

馬克