From bbee153491215417a3f203facb036b261f0f779a Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Mon, 24 Oct 2022 13:55:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=81=E9=87=8F=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8A=A5=E8=A1=A8=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../proxy/server/dal/DataCleanMapper.java | 23 +++++- .../server/dal/FlowReportMinuteMapper.java | 36 ++++++++++ .../server/dal/entity/FlowReportMinuteDO.java | 72 +++++++++++++++++++ .../proxy/server/job/DataCleanJob.java | 21 ++++++ .../server/job/FlowReportForMinuteJob.java | 45 ++++++++++++ .../src/main/resources/sql/job_info.data.sql | 4 +- .../src/main/resources/sql/license.data.sql | 2 +- .../main/resources/sql/port_mapping.data.sql | 4 +- .../src/main/resources/sql/port_pool.data.sql | 40 +++++------ .../src/main/resources/sql/user.data.sql | 4 +- 10 files changed, 222 insertions(+), 29 deletions(-) create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportMinuteDO.java create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForMinuteJob.java diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/DataCleanMapper.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/DataCleanMapper.java index 1b77d255..dc1d588d 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/DataCleanMapper.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/DataCleanMapper.java @@ -1,3 +1,24 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package fun.asgc.neutrino.proxy.server.dal; import fun.asgc.neutrino.core.annotation.Component; @@ -5,8 +26,6 @@ import fun.asgc.neutrino.core.aop.Intercept; import fun.asgc.neutrino.core.db.annotation.Delete; import fun.asgc.neutrino.core.db.mapper.SqlMapper; -import java.util.Date; - /** * @author: aoshiguchen * @date: 2022/9/17 diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java new file mode 100644 index 00000000..37dec097 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.proxy.server.dal; + +import fun.asgc.neutrino.core.annotation.Component; +import fun.asgc.neutrino.core.aop.Intercept; +import fun.asgc.neutrino.core.db.mapper.SqlMapper; + +/** + * @author: aoshiguchen + * @date: 2022/10/24 + */ +@Intercept(ignoreGlobal = true) +@Component +public interface FlowReportMinuteMapper extends SqlMapper { + +} diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportMinuteDO.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportMinuteDO.java new file mode 100644 index 00000000..1c729a51 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportMinuteDO.java @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.proxy.server.dal.entity; + +import fun.asgc.neutrino.core.db.annotation.Id; +import fun.asgc.neutrino.core.db.annotation.Table; +import lombok.Data; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author: aoshiguchen + * @date: 2022/10/24 + */ +@ToString +@Accessors(chain = true) +@Data +@Table("job_info") +public class FlowReportMinuteDO { + @Id + private Integer id; + /** + * 用户ID + */ + private Integer userId; + /** + * licenseId + */ + private Integer licenseId; + /** + * ip + */ + private String ip; + /** + * 写入字节数 + */ + private Long writeBytes; + /** + * 读取字节数 + */ + private Long readBytes; + /** + * 报表统计时间 + * yyyy-MM-dd HH:mm + */ + private String date; + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/DataCleanJob.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/DataCleanJob.java index dc01a175..87ccbfed 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/DataCleanJob.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/DataCleanJob.java @@ -1,3 +1,24 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package fun.asgc.neutrino.proxy.server.job; import com.alibaba.fastjson.JSONObject; diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForMinuteJob.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForMinuteJob.java new file mode 100644 index 00000000..c5956bb0 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForMinuteJob.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.proxy.server.job; + +import fun.asgc.neutrino.core.annotation.Component; +import fun.asgc.neutrino.core.annotation.NonIntercept; +import fun.asgc.neutrino.core.quartz.IJobHandler; +import fun.asgc.neutrino.core.quartz.annotation.JobHandler; +import lombok.extern.slf4j.Slf4j; + +/** + * 流量统计报表 - 分钟级别 + * @author: aoshiguchen + * @date: 2022/10/24 + */ +@Slf4j +@NonIntercept +@Component +@JobHandler(name = "FlowReportForMinuteJob", cron = "0 */1 * * * ?", param = "") +public class FlowReportForMinuteJob implements IJobHandler { + + @Override + public void execute(String param) throws Exception { + // TODO aoshiguchen + } +} diff --git a/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql b/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql index cacaf11c..72099526 100644 --- a/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql +++ b/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql @@ -1,5 +1,5 @@ #job_qrtz_trigger_info -insert into job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) values +INSERT INTO job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) VALUES (1, '示例Job', 'DemoJob', '0/10 * * * * ?', '{"a":101}', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) values +INSERT INTO job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) VALUES (2, '数据清理任务', 'DataCleanJob', '0 0 1 * * ?', '', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); \ No newline at end of file diff --git a/neutrino-proxy-server/src/main/resources/sql/license.data.sql b/neutrino-proxy-server/src/main/resources/sql/license.data.sql index 5e22e839..b1962f32 100644 --- a/neutrino-proxy-server/src/main/resources/sql/license.data.sql +++ b/neutrino-proxy-server/src/main/resources/sql/license.data.sql @@ -1,3 +1,3 @@ #license -insert into license(`id`, `name`, `key`, `user_id`, `is_online`, `enable`, `create_time`, `update_time`) values +INSERT INTO license(`id`, `name`, `key`, `user_id`, `is_online`, `enable`, `create_time`, `update_time`) VALUES (1, '我的mac', 'b0a907332b474b25897c4dcb31fc7eb6', 1, 2, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); diff --git a/neutrino-proxy-server/src/main/resources/sql/port_mapping.data.sql b/neutrino-proxy-server/src/main/resources/sql/port_mapping.data.sql index 770e65ff..50256c16 100644 --- a/neutrino-proxy-server/src/main/resources/sql/port_mapping.data.sql +++ b/neutrino-proxy-server/src/main/resources/sql/port_mapping.data.sql @@ -1,5 +1,5 @@ #port_mapping -insert into port_mapping(`id`, `license_id`, `server_port`, `client_ip`, `client_port`, `is_online`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_mapping(`id`, `license_id`, `server_port`, `client_ip`, `client_port`, `is_online`, `enable`, `create_time`, `update_time`) VALUES (1, 1, 9101, '127.0.0.1', 8080, 2, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_mapping(`id`, `license_id`, `server_port`, `client_ip`, `client_port`, `is_online`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_mapping(`id`, `license_id`, `server_port`, `client_ip`, `client_port`, `is_online`, `enable`, `create_time`, `update_time`) VALUES (2, 1, 9102, '127.0.0.1', 3306, 2, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); diff --git a/neutrino-proxy-server/src/main/resources/sql/port_pool.data.sql b/neutrino-proxy-server/src/main/resources/sql/port_pool.data.sql index ad030a75..7bebe281 100644 --- a/neutrino-proxy-server/src/main/resources/sql/port_pool.data.sql +++ b/neutrino-proxy-server/src/main/resources/sql/port_pool.data.sql @@ -1,41 +1,41 @@ #端口池 -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (1, 9101, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (2, 9102, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (3, 9103, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (4, 9104, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (5, 9105, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (6, 9106, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (7, 9107, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (8, 9108, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (9, 9109, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (10, 9110, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (11, 9111, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (12, 9112, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (13, 9113, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (14, 9114, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (15, 9115, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (16, 9116, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (17, 9117, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (18, 9118, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (19, 9119, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) values +INSERT INTO port_pool(`id`, `port`, `enable`, `create_time`, `update_time`) VALUES (20, 9120, 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); diff --git a/neutrino-proxy-server/src/main/resources/sql/user.data.sql b/neutrino-proxy-server/src/main/resources/sql/user.data.sql index 1b61b852..cf5f002e 100644 --- a/neutrino-proxy-server/src/main/resources/sql/user.data.sql +++ b/neutrino-proxy-server/src/main/resources/sql/user.data.sql @@ -1,5 +1,5 @@ #用户表 6613b92b77056faeb72068f184ed4c4f -insert into `user`(`id`, `name`,`login_name`,`login_password`,`enable`,`create_time`, `update_time`) values +INSERT INTO `user`(`id`, `name`,`login_name`,`login_password`,`enable`,`create_time`, `update_time`) VALUES (1, '管理员', 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); -insert into `user`(`id`, `name`,`login_name`,`login_password`,`enable`,`create_time`, `update_time`) values +INSERT INTO `user`(`id`, `name`,`login_name`,`login_password`,`enable`,`create_time`, `update_time`) VALUES (2, '游客', 'visitor', 'e10adc3949ba59abbe56e057f20f883e', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW'));