Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中,如何将时间戳日期与仅日期参数进行比较?_Mysql_Datetime_Date - Fatal编程技术网

在MySQL中,如何将时间戳日期与仅日期参数进行比较?

在MySQL中,如何将时间戳日期与仅日期参数进行比较?,mysql,datetime,date,Mysql,Datetime,Date,在SQL语句中,如何将保存为时间戳的日期与YYYY-MM-DD格式的日期进行比较 示例:从时间戳为'2012-05-25'的表中选择* 我希望此查询返回指定日期内具有时间戳的所有行,但它只返回具有午夜时间戳的行 谢谢您可以使用DATE()函数提取时间戳的日期部分: SELECT * FROM table WHERE DATE(timestamp) = '2012-05-25' 但是,如果您在时间戳列上有索引,这会更快,因为如果您有索引,它可以利用时间戳列上的索引: SELECT * FROM

在SQL语句中,如何将保存为时间戳的日期与YYYY-MM-DD格式的日期进行比较

示例:
从时间戳为'2012-05-25'的表中选择*

我希望此查询返回指定日期内具有时间戳的所有行,但它只返回具有午夜时间戳的行

谢谢

您可以使用
DATE()
函数提取时间戳的日期部分:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'
但是,如果您在时间戳列上有索引,这会更快,因为如果您有索引,它可以利用时间戳列上的索引:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'

使用MYSQL的转换功能:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 
这应该有效

从时间戳>='2012-05-05 00:00:00'的表格中选择*
 WHERE cast(timestamp as date) = '2012-05-05'

和timestamp如果您使用SQL参数来运行查询,那么这将非常有用

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
使用


当我读到你的问题时,我以为你是在Oracle DB上,直到我看到标签“MySQL”。无论如何,对于与Oracle合作的人员,以下是方法:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

正如一些人所建议的,通过使用
DATE(timestamp)
可以对列进行操作,因此不能依赖索引顺序

但是,只有在包含毫秒的情况下,在
之间使用
才是可靠的。在“2012-05-05 00:00:00”和“2012-05-05 23:59:59”之间的时间戳
示例中,排除时间戳介于
2012-05-05 23:59:59.001和
2012-05-05 23:59:59.999之间的记录。然而,由于数据类型的精确性,即使这种方法也存在一些问题。有时999毫秒被四舍五入

最好的办法是:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'
从表中选择*

其中date>='2012-05-05'和date当我研究这个问题时,我认为最好修改BETWEEN解决方案,以显示一个特定的非静态/字符串日期的示例,而不是一个可变日期,或者今天的日期,例如
CURRENT_date()
。此将使用log\u timestamp列上的索引

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));
为了避免第二天早上12点的案子,我花了几秒钟/几微秒。但是,您也可以通过比较运算符执行“INTERVAL”1天,以实现更方便读者的非中间方法:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));
选择*
从某张桌子上
哪里
日志时间戳>=时间戳(当前日期())和
日志时间戳<时间戳(日期添加(当前日期(),间隔1天));

这两种方法都将使用索引,并且应该执行得更快。两者似乎都一样快。

通过我刚刚运行的一个小测试,我发现使用BETWEEN的速度要快10倍,只需使用一个日期就可以清楚地知道什么数字意味着什么类型。
SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));
SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));