我想我今天写的一些软件将在30年内使用.但我也意识到,很多都是基于UNIX传统,即将时间暴露为自1970年以来的秒数.
#include <stdio.h>
#include <time.h>
#include <limits.h>
void print(time_t rt) {
struct tm * t = gmtime(&rt);
puts(asctime(t));
}
int main() {
print(0);
print(time(0));
print(LONG_MAX);
print(LONG_MAX+1);
}
Run Code Online (Sandbox Code Playgroud)
执行结果:
函数ctime(),gmtime()和localtime()都将一个时间值作为参数,该时间值表示自Epoch(1970年1月1日00:00:00 UTC;参见时间(3))以来的时间(以秒为单位).
我想知道作为程序员在这个领域是否有任何主动做的事情,或者我们是否相信所有软件系统(又称操作系统)将来会如何神奇地升级?
更新看起来确实64位系统是安全的:
import java.util.*;
class TimeTest {
public static void main(String[] args) {
print(0);
print(System.currentTimeMillis());
print(Long.MAX_VALUE);
print(Long.MAX_VALUE + 1);
}
static void print(long l) {
System.out.println(new Date(l));
}
}
Run Code Online (Sandbox Code Playgroud)
但那一年292278994呢?
我正在阅读一篇文章,该文章展示了一些关于三种不同的MySQL日期/时间存储选项执行情况的非常好的信息和基准.
MySQL DATETIME与TIMESTAMP对比INT性能和与MyISAM的基准测试
在阅读本文时,您开始意识到使用整数只是一种浪费,您应该使用MySQL Datetime或Timestamp列类型.
然而,在文章的最后,他再做了一次不使用MySQL函数的测试,你突然发现直接INT的速度是使用unix时间戳搜索时两个MySQL选项的2倍.
所以它突然恍然大悟 - 呃,PHP应用程序都使用了什么? 时间()!几乎每个php应用程序都将其逻辑基于Unix Epoch.这意味着在特定时间内对结果的大多数查询都是基于time()开始的,然后转换为使用MySQL的字段.
这让我有以下几点:
存储为INT的Unix时间戳更快,占用更少的空间,并且可以在PHP的基于时间()的计算中原生工作.
MySQL日期类型更适合MySQL方面的操作和逻辑.
目前,Unix和MySQL时间戳只能在2037年之前工作,这意味着您必须在将来使用日期时间字段表示更大的日期.
date = NOW()使用复制导致数据不一致时,MySQL命令可能会滞后.
所以将这个应用到现实生活中我们看到这些结果给出的答案,大多数真正的DBA会使用像PostgreSQL这样的更好的引擎 - 是否有arny
但是,大多数使用数据库逻辑的应用程序可能会使用PostgreSQL.这意味着我们所有其他程序员只使用MySQL作为我们数据的存储槽(你知道这是真的)这使得保持字段小,快,UNIX INT看起来它实际上是最好的选择.
那你觉得怎么样?
时间戳是否真的比MySQL日期字段更适合PHP应用程序?
我在查找Node.js,knex和MySQL(通过Bookshelf)常见的日期格式时遇到了一些麻烦.
我使用Knex架构构建器设置了一个表:
knex.schema.createTableIfNotExists("examples", function (table) {
...
table.dateTime("some_datetime");
})
Run Code Online (Sandbox Code Playgroud)
这将DATETIME在MySQL中创建一个类型的列.
我有一个代表这个的Bookshelf模型(在这里省略了所有的样板文件),我尝试使用内置Date.now()的值:
exampleModel.save({
some_datetime: Date.now()
})
Run Code Online (Sandbox Code Playgroud)
在Knex中打开调试后,我看到查询实际上是在尝试插入一个毫秒的纪元时间戳("......"为简洁起见):
{ ...
bindings: [ 1485644012453, ... ],
sql: 'update `examples` set `some_datetime` = ? where `id` = ?' }
Run Code Online (Sandbox Code Playgroud)
但这是不正确的,因为MySQL希望你FROM_UNIXTIME在这种情况下使用,因此数据库中的结果日期当然是好的0000-00-00 00:00:00.
我应该在这做什么才能使这一切保持一致?
Date.now()?我在这里找不到共同点.我的直觉说dateTime在使用Knex,Date.now()在Node中,DATETIME在MySQL中,但这是不正确的.
只是要清楚:这个问题不一定集中在什么是哲学正确的-此刻,我居然无法弄清楚如何存储日期/数据库倍一切.我正在寻找一个有效的组合,语义正确只会是一个奖励.
我正在研究应用程序的Product Catalog模块Invoicing.
当用户创建新发票时,该product name字段应为自动填充字段,该字段显示产品目录中最近使用的产品.
如何在数据库中存储此"使用新近度/频率"?
我正在考虑添加一个新的字段recency,1每次使用该产品时都会增加,而1/(count of all products)当使用其他产品时,该字段会减少.然后使用此recency字段进行排序,但在我看来这不是最好的解决方案.
你能帮我解决一下这类问题的最佳做法吗?