【问题标题】:Querying by date with a date and time string使用日期和时间字符串按日期查询
【发布时间】:2014-07-01 21:07:17
【问题描述】:

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

SELECT COUNT(DISTINCT(NETID)) EARLIEST_MONTHLY_DATE FROM REPORT_SERVICE_USAGE

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

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

【问题讨论】:

  • 列类型是日期日期时间还是文本? varchar?
  • 供应商是什么(Oracle、MS-SQL 等)?
  • 它是 Oracle 供应商。列类型为日期。

标签: sql oracle date


【解决方案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')

【讨论】:

  • 我有一个简短的问题。我使用 2013-09-01 和 2013-09-30 进行测试。为什么当我查询 early_monthly_date >= to_date('2013-09-01', 'yyyy-mm-dd') 和 early_monthly_date = to_date('2013-09-01', 'yyyy-mm-dd') 和 early_monthly_date
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多