Mysql日期类型大小比较---拉取给定时间段的记录

43 篇文章 0 订阅


我们知道,mysql里边,日期类型有很多表现形式,date, datetime,timestamp等类型。考虑这样一种场景:

按时间段拉取给定时间段的内容,这时,我们就得使用日期类型的比较了。

表结构:tablename_tbl

+-----------------+--------------+------+-----+-------------------+----------------+
| Field    |   Type |   Null |   Key |   Default |   Extra |
+-----------------+--------------+------+-----+-------------------+----------------+
| id    |   mediumint(8)   | NO    | PRI   | NULL    |   auto_increment |
| title    | varchar(40)    | NO    |    | NULL |    |
| content  | mediumtext    | NO    |    | NULL |    |
| addtime  | timestamp    | NO |    |   CURRENT_TIMESTAMP |    |

其中addtime为timestamp类型的,现在我们要拉去过去三小时内新增的记录,我们可以采取比较unix时间戳以及比较日期这两种方式实现;

首先看第一种:unix时间戳比较

Mysql内置函数:UNIX_TIMESTAMP()

若无参数调用,则默认返回一个 从 '1970-01-01 00:00:00' 到当前时刻的秒数(无符号整数)。若用date 来调用 unix_timestamp(),它会返回从 '1970-01-01 00:00:00' 到 date表示的时刻为止的秒数;date 可以是一个 date 字符串、一个 datetime字符串、一个 timestamp或一个当地时间的yymmdd 或yyymmdd格式的数字。

则sql语句可以这样写:

select id,title,content,addtime from tablename_tbl where UNIX_TIMESTAMP(addtime)>= UNIX_TIMESTAMP() - 10800 and UNIX_TIMESTAMP(addtime) <= UNIX_TIMESTAMP()   //10800为3小时的秒数。

 

第二种方式:日期比较

首先看直接使用+-运算:

这种方式中,特别需要注意的是,一个时间日期值加/减一个值的含义。

select now();
+---------------------+
| now() |
+---------------------+
| 2013-03-15 13:08:45 |
+---------------------+

通过now函数,我们可以获取到当前的时间,然后再请看:

select now(),now()+1;
+---------------------+-----------------------+
| now() | now()+1 |
+---------------------+-----------------------+
| 2013-03-15 13:10:15 | 20130315131016.000000 |
+---------------------+-----------------------+

select now(),now()-1;
+---------------------+-----------------------+
| now() | now()-1 |
+---------------------+-----------------------+
| 2013-03-15 13:14:18 | 20130315131417.000000 |
+---------------------+-----------------------+

这两条语句执行后,第二列表示是在当前时刻加上/减去 一秒,这里要注意看第二列的表示形式:

20130315131016.000000  (yyyy mm dd HH MM ss.000000)即:在给now()加上或者减去一个值的时候,跟now()的结果的表示形式是不同的,我们再看:

select now(),now()-01;
+---------------------+-----------------------+
| now() | now()-01 |
+---------------------+-----------------------+
| 2013-03-15 13:15:05 | 20130315131504.000000 |
+---------------------+-----------------------+

select now(),now()+01;
+---------------------+-----------------------+
| now() | now()+01 |
+---------------------+-----------------------+
| 2013-03-15 13:15:11 | 20130315131512.000000 |
+---------------------+-----------------------+

看到这里,很奇怪是不是,怎么直接在数字前加0也可以执行?加减的难道不是秒数吗?(我之前就是这样认为的),执行的结果也是给now()加、减1秒;

select now(),now()+101;
+---------------------+-----------------------+
| now() | now()+101 |
+---------------------+-----------------------+
| 2013-03-15 13:17:14 | 20130315131815.000000 |
+---------------------+-----------------------+

select now(),now()-101;
+---------------------+-----------------------+
| now() | now()-101 |
+---------------------+-----------------------+
| 2013-03-15 13:17:22 | 20130315131621.000000 |
+---------------------+-----------------------+

我们这两条语句后的执行结果,通过对比两列,我们可以发现,分别是给now()的时刻加上1分钟、1秒钟, 减去1分钟、1秒钟;再看个例子

select now(),now()+0101;
+---------------------+-----------------------+
| now() | now()+0101 |
+---------------------+-----------------------+
| 2013-03-15 13:19:34 | 20130315132035.000000 |
+---------------------+-----------------------+

select now(),now()-0101; 
+---------------------+-----------------------+
| now() | now()-0101 |
+---------------------+-----------------------+
| 2013-03-15 13:19:38 | 20130315131837.000000 |
+---------------------+-----------------------+

是不是跟奇怪了,这两条语句同样也是给当前时间加/减1分钟1秒钟。再看一个结合了年月日的例子:

select now(), now()+00010203040506;
+---------------------+-----------------------+
| now() | now()+00010203040506 |
+---------------------+-----------------------+
| 2013-03-15 13:21:50 | 20140518172656.000000 |
+---------------------+-----------------------+

select now(), now()-00010203040506; 
+---------------------+-----------------------+
| now() | now()-00010203040506 |
+---------------------+-----------------------+
| 2013-03-15 13:21:54 | 20120112091648.000000 |
+---------------------+-----------------------+

看到这里,我们大概就能够明白了+-的含义了吧;上边两条语句是:给当前日期加减:1年2个月3天 4小时5分钟6秒钟。

所以,当我们在给now()+-一个时间的时候,其实应该这样理解的:

+1/+01:加1秒钟

+101/+0101:加1分钟1秒钟

+10101/+010101:加1小时1分钟1秒钟

+1010101/+01010101:加1天1分钟1秒钟

+101010101/+0101010101:加1月1天1分钟1秒钟

+1101010101/+010101010101:加1年1月1天1分钟1秒钟,这里要注意下,年这个部分可以是4位(高位没有的话会补零):00010101010101

(减也是类似的)

所以对于前边的问题:拉去过去三小时内新增的记录, 就可以这样写sql了:

select id,title,content,addtime from tablename_tbl where addtime >= now() - 30000 and addtime <= now()

 

另外还有一种方式就是使用mysql提供的:

date_add(向日期添加指定的时间间隔), DATE_ADD(date,INTERVAL expr type)

date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。

Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH


date_sub(向日期减去指定的时间间隔), DATE_SUB(date,INTERVAL expr type) (使用方法同date_add类似)

sql可以这样写:

select id,title,content,addtime from tablename_tbl where addtime >= date_sub(now, INTERVAL 3 HOUR) AND addtime < now()

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要拉取 openjdk:11-jdk-stretch docker 镜像,可以按照以下步骤进行: 首先,确保已经安装了 Docker 并且可以正常运行。你可以在终端中输入 docker version 来检查 Docker 版本信息。 接下来,在终端中运行以下命令来拉取 openjdk:11-jdk-stretch 镜像: docker pull openjdk:11-jdk-stretch 这个命令会从 Docker Hub 上下载 openjdk:11-jdk-stretch 镜像,并且自动保存到本地。 拉取过程可能会需要一些时间,具体取决于你的网络速度。 当下载完成后,你可以使用以下命令来查看已下载的镜像列表: docker images 这个命令会列出所有本地已下载的镜像,你可以在其中找到刚刚拉取的 openjdk:11-jdk-stretch 镜像。 接下来,你可以使用以下命令来创建并运行一个基于 openjdk:11-jdk-stretch 镜像的容器: docker run -it openjdk:11-jdk-stretch 这个命令会自动运行 openjdk:11-jdk-stretch 镜像,并通过交互模式(-it 参数)连接到容器的终端。 现在你可以在容器中运行 Java 应用程序或执行其他操作。在容器中进行的更改和操作将不会影响到本地机器。 最后,如果你想停止正在运行的容器,可以按下 Ctrl+C 来退出容器终端,并使用以下命令停止容器: docker stop 容器ID 这里的 "容器ID" 是你要停止的容器的唯一标识符。 以上就是使用 Docker 拉取 openjdk:11-jdk-stretch 镜像的步骤和基本操作。希望对你有所帮助! ### 回答2: 要拉取 OpenJDK 11 的 Docker 镜像,可以使用以下命令: ``` $ docker pull adoptopenjdk/openjdk11:jdk-11.0.12_7-docker-stretch ``` 这个镜像使用了 AdoptOpenJDK 组织提供的 OpenJDK 11 版本,并基于 Debian Stretch 系统构建。 首先,我们使用 `docker pull` 命令指定要拉取的镜像。它会下载镜像的最新版本并保存到本地。在这个命令中,我们使用了 `adoptopenjdk/openjdk11` 作为镜像的仓库名,后面的 `jdk-11.0.12_7-docker-stretch` 是具体的版本标识符,表示要拉取的是 OpenJDK 11 版本。 拉取镜像可能需要一些时间,取决于你的网络速度和镜像的大小。一旦拉取完成,你就可以使用该镜像来创建和运行基于 OpenJDK 11 的应用程序的容器了。 希望这个回答对你有所帮助! ### 回答3: 要拉取OpenJDK 11的JDK镜像,可以使用以下命令: ``` docker pull openjdk:11-jdk-stretch ``` 这个命令会从Docker Hub上拉取OpenJDK 11的JDK镜像,镜像的标签为"stretch",表示基于Debian 9系统。 拉取过程中,Docker会自动下载并解压镜像文件。完成后,你就可以在本地使用该镜像来构建和运行Java应用程序。 OpenJDK是一个开源的Java开发工具包,它提供了Java编译器、运行时环境和相关的开发工具。通过使用Docker拉取OpenJDK镜像,你可以快速搭建开发和测试环境,而无需手动安装和配置Java环境。 在拉取完镜像之后,你可以使用以下命令来查看已拉取的镜像列表: ``` docker images ``` 该命令会显示已拉取的OpenJDK 11镜像的详细信息,包括镜像ID、标签、大小和创建时间等。 希望这个回答能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值