0

我很好奇构建一个查询的正确方法是什么,其中基于代表特定月份的时间戳提取行。鉴于不同的月份有不同的天数,有没有办法生成一个查询,该查询总是为您提供时间戳包含当前月份的行,以便结果只包括当前月份?

4

6 回答 6

2

你的意思是这样的吗

SELECT * FROM tbl WHERE 
MONTH(timesp) = MONTH(NOW()) AND 
YEAR(timesp) = YEAR(NOW());
于 2013-06-03T16:41:48.630 回答
1

您可以使用以下FROM_UNIXTIME()功能:

SELECT * 
FROM tableName 
WHERE MONTH(FROM_UNIXTIME(timestampField))==6
于 2013-06-03T16:41:37.170 回答
0

只需使用MONTH

select *
from foo
where month_column = MONTH(getdate())
and year_column = YEAR(getdate())
于 2013-06-03T16:43:07.453 回答
0

试试这个 sql。

select *
from yourtable
where yourdatefield>=DATE_SUB(CURDATE(),INTERVAL 1 MONTH);
于 2013-06-03T16:43:37.110 回答
0

你正在寻找这样的东西:

SELECT * FROM table where MONTH(date_row) = $month;
于 2013-06-03T16:46:10.847 回答
0

如果您在日期字段上有索引,那么这是有效的(T-SQL 语法,这个想法适用于任何 RDBMS)

SELECT 
  * 
FROM 
  tableName 
WHERE 
  dateTimeField
    BETWEEN
      -- build the string 'YYYY-MM-01', cast back as a datetime
      CAST(
        CAST(YEAR(GETDATE()) AS varchar) + '-' + CAST(MONTH(GETDATE()) AS varchar) + '-01'
        AS datetime
      )
    AND
      -- add one month, subtract one day
      DATEADD(mm, 1,
        -- build the string 'YYYY-MM-01', cast back as a datetime
        CAST(
          CAST(YEAR(GETDATE()) AS varchar) + '-' + CAST(MONTH(GETDATE()) AS varchar) + '-01'
          AS datetime
        )
      ) - 1

当然,在正确范围内获得两个日期时间值的任何其他方法都可以。

SQL Server 必须LEFT(CONVERT(varchar, GETDATE(), 120), 8) + '01'将日期时间转换为字符串,其他 Db 服务器有自己的功能来做同样的事情。也许您可以更轻松地在调用应用程序中计算这两个值——如何获得它们并不是重点。

关键是BETWEEN可以使用索引,而其他适用的解决方案WHERE MONTH(dateTimeField) = 6将触发表扫描,这是您可以对表执行的最慢操作。

于 2013-06-03T16:55:39.813 回答