按日期查询日期和时间字符串

时间:2014-07-01 21:07:18

标签: sql oracle date

我有一个数据库表,其中一列包含日期值。字符串的格式为“YYYY-MM-DD HH24:MI:SS”。我希望能够在没有时间的情况下选择另一列WHERE日期为XXXX / XX / XX。我对SQL不太熟悉,所以我不确定如何做到这一点。以下代码是我目前正在尝试查询的内容:

SELECT COUNT(DISTINCT(NETID)) EARLIEST_MONTHLY_DATE FROM REPORT_SERVICE_USAGE

WHERE EARLIEST_MONTHLY_DATE LIKE '%2014-03-14%' 

我不知道截断时间是否更容易(我不一定需要它),但如果我这样做,我可能需要一些指导如何完成。

1 个答案:

答案 0 :(得分:1)

最有效的方法是:

where earliest_monthly_date >= to_date('2014-03-14', 'yyyy-mm-dd')
and earliest_monthly_date < to_date('2014-03-15', 'yyyy-mm-dd')

这样您就不必担心日期字段的任何时间部分。这是另一种方式,它是等效的,但速度较慢:

where trunc(earliest_monthly_date) = to_date('2014-03-14', 'yyyy-mm-dd')

trunc函数会删除时间部分,但是使用where子句中的函数比使用字段本身要慢。

您还应该意识到日期本质上是浮点数。它们被格式化为字符串,因此人们可以阅读它们。您也可以进行自己的格式化。在oracle中,to_char()函数是要使用的函数。

查看问题中的代码,有三种语法错误。首先,

COUNT(DISTINCT(NETID)) 

应该是

COUNT(DISTINCT NETID)   

接下来,应该跟一个逗号,

COUNT(DISTINCT NETID),

最后,你需要一个group by子句

group by earliest_monthly_date

这就是语法。你可能想要的是这样的:

select to_char(earliest_monthly_date, 'yyyy-mm-dd') thedate
, count(distinct netid) countOfNetId
from report_service_usage
where earliest_monthly_date >= to_date('2014-03-14', 'yyyy-mm-dd')
and earliest_monthly_date < to_date('2014-03-15', 'yyyy-mm-dd')
group by to_char(earliest_monthly_date, 'yyyy-mm-dd')