Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 按SQL中保存为字符串的日期筛选_Mysql_Sql_Sqlite - Fatal编程技术网

Mysql 按SQL中保存为字符串的日期筛选

Mysql 按SQL中保存为字符串的日期筛选,mysql,sql,sqlite,Mysql,Sql,Sqlite,我正在用Java开发一个程序,保存员工的医疗信息,其中有他们最近做的医疗研究的日期。日期以字符串形式保存在SQL数据库中,格式为“dd/MM/yyyy”。因此,在某个时候,该计划只需要过滤那些最后一次医学研究是在一年前或一年以上的人,然后部署到JTable中 我正在寻找一个SQL命令来过滤它们,并且可以在不同类型的SQL服务器中全局使用。现在我使用的是SQLite,但我希望在MySQL中通过将日期保存为列中的字符串来实现同样的效果。这是因为工作场所的基础设施很差,互联网也很差,这就是我使用SQL

我正在用Java开发一个程序,保存员工的医疗信息,其中有他们最近做的医疗研究的日期。日期以字符串形式保存在SQL数据库中,格式为“dd/MM/yyyy”。因此,在某个时候,该计划只需要过滤那些最后一次医学研究是在一年前或一年以上的人,然后部署到JTable中

我正在寻找一个SQL命令来过滤它们,并且可以在不同类型的SQL服务器中全局使用。现在我使用的是SQLite,但我希望在MySQL中通过将日期保存为列中的字符串来实现同样的效果。这是因为工作场所的基础设施很差,互联网也很差,这就是我使用SQLite的原因,但如果这个问题得到解决,我们的想法是在代码中只做很少的更改就改成MySQL

程序已经使用一种算法对它们进行了过滤,该算法返回最后一次医学研究和当前日期之间的时间段,但我需要一个SQL语句,这样我就不必恢复所有信息,只需部署周期大于或等于一年的信息

我一直在寻找将字符串转换为日期的方法,然后返回那些周期为1年或以上但没有一个正常工作的日期

现在我正在使用SQLite,但我希望通过将日期保存为列中的字符串,在MySQL中使用相同的语句

什么是普遍的是普遍的。不是dd/MM/yyyy,而是yyyy-MM-dd。2020年8月9日是2020-08-09。如果您使用ISO8601,那么可以将它们存储在SQLite和MySQL中。大多数东西都接受ISO8601

您还可以在MySQL和SQLite中将列声明为
datetime
。SQLite将其存储为字符串,但两者都接受并使用ISO 8601格式

create table foo (
    created_at datetime
);

insert into foo (created_at) values ('2020-08-09');
因此,至少这一部分会起作用

我正在寻找一个SQL代码来过滤它们,并且可以在不同类型的SQL服务器中全局使用

不幸的是,日期函数不是SQL标准的一部分。甚至不是简单的格式:SQLite使用
strftime
,MySQL使用
date\u格式
。格式上有一些重叠,但不是很多

除此之外,您还需要
date
只获取日期部分,
time
只获取时间部分,仅此而已

select date(created_at) from foo;
+------------------+
| date(created_at) |
+------------------+
| 2020-08-09       |
+------------------+
SQL数据库有很多怪癖,MySQL更是如此。我强烈建议选择SQL server并坚持使用它。MySQL、SQLite和PostgreSQL(我推荐)都是免费提供的


还可以处理视图图层中的格式设置。按照ISO 8601获取时间戳,将数据提供给视图层,并让它进行格式化。这是更灵活的。大多数情况下,ISO 8601都可以使用,格式的决定取决于您的用户界面设计师(即使是您)。

您得到了正确的答案-使用ISO 8601格式

create table foo (
    created_at datetime
);

insert into foo (created_at) values ('2020-08-09');
如果您仍然希望以dd/MM/yyyy格式保存日期,那么您需要将
选择
s复杂化,以便将日期转换为某种形式,虽然仍然是字符串,但具有日期兼容的词典顺序(这意味着更像ISO-8601)

选择2019年2月14日之后的日期:


…其中(SUBSTR(dateaschar,7,4)| | SUBSTR(dateaschar,4,2)| | SUBSTR(dateaschar,1,2))>'20190214'

在SQL Server上尝试此代码

SELECT CONVERT(datetime, SUBSTRING(dbField, 7, 4)+'/'+SUBSTRING(dbField, 4, 2)+'/'+SUBSTRING(dbField, 1, 2))
假设

SELECT CONVERT(datetime, SUBSTRING('25-08-2017', 7, 4)+'/'+SUBSTRING('25-08-2017', 4, 2)+'/'+SUBSTRING('25-08-2017', 1, 2))

        
showing #
2017-08-25 00:00:00.000
状况良好

where DATEDIFF(year, GETDATE(), CONVERT(datetime, SUBSTRING(dbField, 7, 4)+'/'+SUBSTRING(dbField, 4, 2)+'/'+SUBSTRING(dbField, 1, 2)))>=1

你成了一个经典错误的受害者,其中最著名的错误是“永远不要卷入亚洲的陆地战争”,但鲜为人知的是:“切勿将日期放在类型为varchar的列中!”@JoelCoehoorn我知道我只会使用dateformat,但在SQLite中我不能使用日期数据类型存储日期,或者不用RDBMSAlso,如果必须使用字符串存储日期,至少要使用ISO-8601标准,即
yyyy-MM-dd
。如果在SQLite中将日期存储在
yyyy-MM-dd
中,然后你可以很容易地将它转换成任何其他格式,但不是相反的方式。因此,我尝试过这种方法,它工作正常,尽管代码凌乱,但在不做很多更改的情况下,它将更容易实现到整个程序中。唯一的问题是我没有得到dateaschar中的逻辑,我的意思是,SUBSTR(dateaschar,7,4)应该以dd/MM/yyyy格式提取年份,但yyyy在Stringnevermind中的6-10索引之间,我只是检查了一下,得到了逻辑,它从1开始的索引中减去7,然后再减去4,就得到了字符数