问题描述
在使用sql进行数据收集时遇到问题,显然,我们生产设备之一的程序员在MS Access数据库中进行了更新,并更改了日期格式,这给我查找特定日期带来了麻烦。 / p>
您能建议如何标准化日期吗?
Prod_Date
-------------
8/24/2020
8/23/2020
8/22/2020
2020-08-24
2020-08-23
2020-08-22
2020-08-21
2020-08-20
2020-08-19
解决方法
如果您没有执行DMY,则只需使用try_convert()
示例
Declare @YourTable Table ([Prod_Date] varchar(50))
Insert Into @YourTable Values
('8/24/2020'),('8/23/2020'),('8/22/2020'),('2020-08-24'),('2020-08-23'),('2020-08-22'),('2020-08-21'),('2020-08-20'),('2020-08-19')
Select *,AsDate = try_convert(date,[Prod_Date])
from @YourTable
返回
Prod_Date AsDate
8/24/2020 2020-08-24
8/23/2020 2020-08-23
8/22/2020 2020-08-22
2020-08-24 2020-08-24
2020-08-23 2020-08-23
2020-08-22 2020-08-22
2020-08-21 2020-08-21
2020-08-20 2020-08-20
2020-08-19 2020-08-19
,
public class Playground {
private static Optional<Map<String,Integer>> transform(List<Tuple<String,Optional<Integer>>> input) {
if (input.stream().anyMatch(t->t.second.isEmpty())) return Optional.empty();
Map<String,Integer> theMap = input.stream()
.map(t -> new Tuple<>(t.first,t.second.get()))
.collect(Collectors.groupingBy(
t1 -> t1.first,Collectors.mapping(t2 -> t2.second,toSingle())));
return Optional.of(theMap);
}
@Test
public void collect() {
List<Tuple<String,Optional<Integer>>> input1 = new ArrayList<>();
input1.add(new Tuple<>("foo",Optional.of(1)));
input1.add(new Tuple<>("bar",Optional.empty()));
Optional<Map<String,Integer>> result1 = transform(input1);
assertTrue(result1.isEmpty());
List<Tuple<String,Optional<Integer>>> input2 = new ArrayList<>();
input2.add(new Tuple<>("foo",Optional.of(1)));
input2.add(new Tuple<>("bar",Optional.of(2)));
Optional<Map<String,Integer>> result2 = transform(input2);
assertTrue(result2.isPresent());
assertEquals((int)1,(int)result2.get().get("foo"));
assertEquals((int)2,(int)result2.get().get("bar"));
}
private static class Tuple<T1,T2> {
public T1 first;
public T2 second;
public Tuple(T1 first,T2 second) {
this.first = first;
this.second = second;
}
}
public static <T> Collector<T,?,T> toSingle() {
return Collectors.collectingAndThen(
Collectors.toList(),list -> list.get(0)
);
}
}
列没有的格式,这意味着您的“日期”列不是date
,而是date
。有一种“简便”的方法可以解决此问题,可以修复列的数据类型。
希望,您只有2种格式,varchar
和yyyy-MM-dd
。如果是这样,那么我们可以使用以下样本集:
M/d/yyyy
首先,我们需要获取ISO格式的数据,特别是我将使用CREATE TABLE dbo.YourTable (Prod_Date varchar(10))
INSERT INTO dbo.YourTable
VALUES ('8/24/2020'),('2020-08-19');
。为此,不幸的是,我们需要几个嵌套的yyyyMMdd
,它们带有样式代码:
CONVERT
然后我们可以更改列的数据类型:
UPDATE dbo.YourTable
SET Prod_Date = TRY_CONVERT(varchar(8),ISNULL(TRY_CONVERT(date,Prod_Date,101),TRY_CONVERT(date,23)),112);
然后您的表中不再有格式,并且该问题不再可能发生。