0

假设我有一个包含from_month(int, 1-12) 和to_month(int, 1-12) 列的表,然后我有另一个包含from(int, unix timestamp) 和to(int, unix timestamp) 列的表。

考虑到两边的年份边界,我将如何匹配from_monthto_month列包含我的from和时间戳的行?to

设想:

  • 使用from_monthas 11to_monthas 2,有没有办法让我获得1383264000 的值和 1391212800from来匹配?to

然而同时:

  • 使用from_monthas 3to_month 8,有没有办法让我获得1362096000 的值和 1375315200from来匹配?to

说明:

  • 我需要第二个表中的记录,其中两个时间戳的月份都在第一个表设定的范围之间。
  • 另外,我可以从时间戳中获取月份,所以MySQL不需要解析它,但解决方案可能不受影响。
4

3 回答 3

0

以下是如何从您的输入创建 unix 时间戳的 SQL:

SELECT 
    @year:= YEAR(CURDATE()),
    @from:= CONCAT(@year, '-', 11, '-1') AS from_date,
    @to:= CONCAT(IF(11<=2, @year, @year+1), '-', 2, '-1') AS to_date,
    UNIX_TIMESTAMP(@from) AS from_timestamp,
    UNIX_TIMESTAMP(@to) AS to_timestamp;

第 11 个月和第 2 个月是硬编码的。我使用了变量,所以 sql 更短。

SQL小提琴。


您的情况是:

使用 from_month 为 11 和 to_month 为 2,有没有一种方法可以让我获得 1383264000 的 from 值和 1391212800 的 to 值来匹配?

这是从2013-11-01 00:00:002014-02-01 00:00:00。你确定你需要TO date从月初开始吗?还是二月的最后一天?

于 2013-09-17T17:45:25.500 回答
0

找到了一种解决方案,该解决方案使用月份作为0-11的整数进行包含月份检查。

# Filter
SET @Fs = 2; # Mar
SET @Fe = 7; # Aug
# 
SET @Ps = 2; # Mar
SET @Pe = 4; # May

SELECT

    (
        (
            MOD(@Pe - @Fs + 24, 12) <= MOD(@Fe - @Fs + 24, 12)
        ) 
        AND (
            MOD(@Ps - @Fs + 24, 12) <= MOD(@Pe - @Fs + 24, 12)
        )
    ) 
    OR MOD(@Fe - @Fs + 24, 12)=11;
于 2013-09-18T14:36:06.613 回答
0

对不起,但我不确定你想如何与year

但如果只有月份,您可以使用FROM_UNIXTIME从 unixtime 获取日期,并MONTH从日期获取月份

例如

SELECT FROM_UNIXTIME(1391212800)
> February, 01 2014 00:00:00+0000

SELECT MONTH(FROM_UNIXTIME(1391212800))
> 2

从unix时间开始,我相信你可以做剩下的事情或帮助解释你想要的更多细节。

希望这有帮助

于 2013-09-17T17:39:41.167 回答