【问题标题】:Filter with date() on $sql query在 $sql 查询中使用 date() 过滤
【发布时间】:2013-07-05 14:25:05
【问题描述】:

我无法理解在哪里进行转换以获取 unixtime 并将其转换为特定的月份和年份。

$sql = "SELECT * FROM logs WHERE clientid = '5604' AND timestamp = 'Jan 13' ";

我需要在哪里放置 date() 函数以将时间戳过滤到指定的月份和年份?

【问题讨论】:

  • timestamp 字段的类型是什么,示例值是什么?

标签: php sql date


【解决方案1】:

首先,MySQL 中的date litterals 必须遵循以下格式之一:

  • 年*月*日
  • YYYY*MM*DD

* 表示“任何 non-digit 非字母数字字符或根本没有字符”。

YYYYYY 是两位或四位数字的年份。

MMDD 是月份和日期。

然后,如果您想获得特定日期的结果,您可以执行以下操作:

... WHERE DATE(timestamp_field) = '2013-01-13';

但实际上这个查询不能使用timestamp_field 上的索引。这种方法更好,因为可以使用timestamp_field 上的索引:

... WHERE timestamp_field >= '2013-01-13' AND timestamp_field < '2013-01-14';

【讨论】:

  • 丹的答案是第一位的,所以我已经在那里投票了,但这更详细地解释了为什么该答案是要走的路。
  • 一年中有第 14 个月还是第 13 个月?你用的是哪个日历? ;)
  • @chrislondon LOL 是的,我住在一个非常奇怪的地方 ;)
【解决方案2】:

创建两个变量。使 1 等于您想要的年份月份的第一天,第二天等于下一年月份的第一天。然后就是这样:

where timestamp >= your first variable
and timestamp < your second variable

这种方法将处理您的时间戳字段的时间部分,并且比您尝试使用函数时执行得更快。

【讨论】:

  • +1 - 这执行得更快,因为不需要对表中的值进行任何处理。然后,如果该字段上有索引,则 SQL 引擎需要做的就是对该索引进行范围搜索,而不是完全扫描。 (请否决投票者解释一下,这实际上是一个非常有效的答案。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2014-08-15
  • 2017-11-04
相关资源
最近更新 更多