好的,所以我有一个奇怪的问题......表格中的日期已作为字符串值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。不确定这是否有所不同,但我认为如果我尝试使用右,左,转换来翻转日期,我会这样做。
答案 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
答案 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