将varchar MMDDYYYY转换为MM / DD / YYYY日期时间并仅选择最近的日期

时间:2014-04-25 15:33:20

标签: sql sql-server datetime varchar

好的,所以我有一个奇怪的问题......表格中的日期已作为字符串值MMDDYYYY输入,我试图将其显示为MM/DD/YYYY在报告中,只选择与ID相关的最新日期,因为某些ID可能有多个日期。

我的桌子示例:

  ID  |  MyDate  |
------+----------+
  1   | 01302014 |
  1   | 04222014 |
  2   | 01302014 |

当我选择并插入临时表时,我想看到的是:

  ID  |   MyDate  |
------+-----------+
  1   | 4/22/2014 |
  2   | 1/30/2014 |

我知道将日期存储为字符串值是一种不好的做法,特别是在将它们存储为MMDDYYYY时,但有没有人能解决这个噩梦?

修改

我忘了提一些字段可能是NULL。不确定这是否有所不同,但我认为如果我尝试使用右,左,转换来翻转日期,我会这样做。

10 个答案:

答案 0 :(得分:2)

这个问题差不多一年前,坚果可能有人会发现它很有用。

您需要将CONVERT字符串格式化为DATE并使用ROW_NUMBER函数来显示结果集。

创建表格

DECLARE @tbl TABLE(Id INT, myDate VARCHAR(8))

示例数据

INSERT @tbl
SELECT 1  ,  '01302014' UNION ALL
SELECT 1  ,  '04222014' UNION ALL
SELECT 2  ,  '01302014'

<强>查询

;WITH C AS(
    SELECT  ROW_NUMBER() OVER (PARTITION BY Id ORDER BY CONVERT(DATETIME, (SUBSTRING(myDate, 5, 4) + '.' + SUBSTRING(myDate, 1, 2) + '.' + SUBSTRING(myDate, 3, 2)), 101) DESC) AS Rn
            ,Id
            ,CAST(CONVERT(DATETIME, (SUBSTRING(myDate, 5, 4) + '.' + SUBSTRING(myDate, 1, 2) + '.' + SUBSTRING(myDate, 3, 2)), 101) AS DATE) AS myDate
    FROM @tbl
)
SELECT Id, myDate
FROM C
WHERE Rn = 1

SQLFiddle Demo

答案 1 :(得分:1)

使用类似以下代码段的CONVERT,无论语言和/或语言环境配置如何,都可以在任何SQL Server上使用。

DECLARE @OldDate varchar(8); 
SELECT @OldDate = '04252012';

SELECT CONVERT(datetime, substring(@OldDate,5,4) + '-' + substring(@OldDate,1,2) + '-' + substring(@OldDate,3,2) + 'T00:00:00')

答案 2 :(得分:0)

Select id,convert(varchar(11),cast(dateValue as Date),101)
From
(
Select id,MAX(cast(MyDate As Date)) as dateValue
From tableName
Group By id
) t

答案 3 :(得分:0)

你可以试试这个:

convert(date,SUBSTRING (MyDate,1,2)+'/'+SUBSTRING (MyDate,3,2)+'/'+SUBSTRING (MyDate,5,4),101)

答案 4 :(得分:0)

Select CONVERT(datetime,RIGHT('01302014',4) +
                       LEFT('01302014',2) +
                       SUBSTRING('01302014',3,2))

'2014-01-30 00:00:00.000'

;with Cte as (Select Id,CONVERT(datetime,RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)) as sDate, C=ROW_NUMBER()
over(PARTITION By Id Order by MyDate desc)
From #Temp)

select * 
from Cte
where C=1

答案 5 :(得分:0)

首先转换为datetime数据类型,然后将其转换为您希望的格式:

select id, convert(varchar, max(convert(datetime,right(mydate, 4)+left(mydate,4))), 101)
from #t
group by id

虽然我无法理解为什么仅将其转换为datetime并将其所属的格式保留给客户端是不够的。

答案 6 :(得分:0)

最简单的解决方案是mySQL str_to_date()函数。

STR_TO_DATE(`MyDate`, '%m%d%Y')

这会将其转换为DATETIME,然后根据需要进行格式化

DATE_FORMAT(STR_TO_DATE(`MyDate`, '%m%d%Y'), '%c/%e/%Y')

答案 7 :(得分:0)

完成查询:

Select ID, Case When IsDate(RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)) = 1 
THEN Convert(varchar(10), Convert(datetime, RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)), 101) 
        ELSE Null END AS MyDate FROM YourTable a where Case When IsDate(RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)) = 1 
        THEN Convert(varchar(10), Convert(datetime,  RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)), 101) 
        ELSE Null END = (Select Max(Case When IsDate(RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)) = 1 
        THEN Convert(varchar(10), Convert(datetime, RIGHT(MyDate,4)+LEFT(MyDate,2)+SUBSTRING(MyDate,3,2)), 101) 
        ELSE Null END)
        FROM YourTable b
        Where a.ID = b.ID
        )

答案 8 :(得分:0)

这是Dimitris Kalaitzis回答的修改版本。

首先,您需要将MyDate转换为String。例如,数据(01302014)不会被视为字符串,转换后将删除前导零。因此,使用CAST将MyDate设置为String并向其添加前导0。然后你找到正确的8个字符,以便从10月到12月摆脱几个月的领先零。

以下是适合您的代码:

 <a class="navbar-brand" href="<?php echo base_url ('welcome/aboutus');?> "> About Us </a>

希望这有帮助。

答案 9 :(得分:0)

您首先必须添加斜杠才能将其转换为日期,请使用STUFF 然后将其转换为DATE并按ID选择MAX组

查询:

SelectedText