2017-06-20 128 views
0

我有一个包含数据类型日期列的表。没有时间戳记的记录

数据从2005年开始通过API格式“MM/DD/YYYY HH12:MI:SS AM”填充,并在某些地方沿着年份改变为“MM/DD/YYYY”,不知道从何时开始。

现在我需要找出什么时候开始发生。如何在查询中使用或不使用时间戳记来分隔记录?

P.S:表是巨大的,数以百万计的记录,所以获取所有行和排序不会帮助。

+2

这些记录*不*有一个时间分量,它只是设置为午夜。所以你应该用'MM/DD/YYYY 00:00:00'来查看记录。 – HoneyBadger

+0

可能会转换为字符串,然后选择min(timestamp),其中的长度(cast(timestamp as string)<= 10或任何长度的MM/DD/YYYY – MiloBellano

+1

@MiloBellano DATE **数据类型** always ** has日期和时间组件 - 如果一个值只是作为每日组件的一部分被插入,那么小时到秒的组件将默认为午夜('00:00:00')。将日期转换为字符串只会产生一个隐式调用到'TO_CHAR'使用'NLS_DATE_FORMAT'会话参数作为格式模型 - 并且将会以相同的格式对所有日期进行格式化,而不管时间分量是否为午夜 – MT0

回答

3

trunc(日期)函数删除日期的时间部分。对于时间trunc(日期)<>日期和没有时间trunc(日期)=日期的记录。

select * 
from your_table 
where trunc(date_column)=date_column; 

编辑:

要带走任何误解

to_date('21-07-2017','DD-MM-YYYY') 

等于

to_date('21-07-2017 00:00:00','DD-MM-YYYY HH24:MI:SS') 

等于

trunc(to_date('21-07-2017 09:20:43','DD-MM-YYYY HH24:MI:SS')) 

在我的文字里没有时间的日期是指没有时间日期指定

to_date('21-07-2017','DD-MM-YYYY') 
+0

所有记录都有时间 - 只是其中的一部分总是在午夜 – MT0

+0

这仍然可以工作 – Rene

+0

@Rene,我认为MT0的评论是关于你的*解释*而不是你的建议查询,它可能会误导说“有时间的记录”和“r没有时间的生态“。 –

4

这将发现这是不是在午夜的最后日期:

SELECT MAX(
     CASE 
      WHEN your_column > TRUNC(your_column) 
      THEN your_column 
     END 
     ) 
FROM your_table