Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
SQLite中两个日期之间的差异_Sqlite - Fatal编程技术网

SQLite中两个日期之间的差异

SQLite中两个日期之间的差异,sqlite,Sqlite,如何获得SQLite中两个日期之间的天数差?我已经尝试过这样的方法: SELECT Date('now') - DateCreated FROM Payment 每次都返回0。SQLite文档是一个很好的参考,该页面是一个很好的书签 SELECT julianday('now') - julianday(DateCreated) FROM Payment; 记住,使用sqlite命令行实用程序处理查询非常容易,这也是很有帮助的: sqlite> select julianday(da

如何获得SQLite中两个日期之间的天数差?我已经尝试过这样的方法:

SELECT Date('now') - DateCreated FROM Payment

每次都返回0。

SQLite文档是一个很好的参考,该页面是一个很好的书签

 SELECT julianday('now') - julianday(DateCreated) FROM Payment;
记住,使用sqlite命令行实用程序处理查询非常容易,这也是很有帮助的:

sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55

这两个答案都提供了更复杂的解决方案,因为它们 必须是。假设付款是在2013年1月6日创建的。 我们想知道今天和今天的区别

sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557 
相差34天。我们可以使用
julianday('now')
更清晰。换句话说,我们不需要
date()
datetime()
用作
julianday()的参数

功能。

天数差异

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
小时差异

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
分钟差异

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
秒差

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)

只是一个写时钟函数的注释。对于那些寻找工作时间的人来说,一个非常简单的改变就是将小时数加上分钟数以60%的百分比显示出来,这是大多数工资公司想要的

CAST((朱利安代(打卡)-朱利安代(打卡))*24小时真实)工作时数

Clock In            Clock Out           HoursWorked
2016-08-07 11:56    2016-08-07 18:46    6.83333332836628

这个答案有点冗长,文档不会告诉您这一点(因为他们假设您将日期存储为数据库中的UTC日期),但这个问题的答案在很大程度上取决于您的日期存储在哪个时区。您也不使用
Date('now')
,而是使用
julianday()
函数,根据一个公共日期计算两个日期,然后将这些结果的差值减去

如果您的日期存储在UTC中:

SELECT julianday('now') - julianday(DateCreated) FROM Payment;

这就是排名靠前的答案,也是最重要的。如果你问我的话,这只是画面的一部分,是一个非常简单的答案

如果您的日期存储在当地时间,使用上述代码将使您的答案错误,即GMT偏移的小时数。如果你像我一样在美国东部,也就是格林尼治标准时间5点,你的成绩会加上5个小时。如果您试图使
DateCreated
符合UTC,因为
julianday('now')
与GMT日期相反:

SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
这有一个错误,它会在夏令时(3月至11月)为创建的日期增加一个小时。假设“现在”是非DST日的中午,并且您在6月(DST期间)中午创建了一些内容,您的结果将为小时部分提供1小时的间隔,而不是0小时。您必须在应用程序代码中编写一个显示结果的函数来修改结果,并从DST日期中减去一小时。我这样做了,直到我意识到我遇到的问题有更好的解决方案:

相反,正如向我指出的,对于存储在本地时间中的日期,将两者都与本地时间匹配:

SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
或将
'Z'
附加到本地时间:

SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
这两种方法似乎都可以弥补DST日期的额外时间,并且不会增加额外的时间,而是直接进行减法——这样,在DST日期的中午创建的项目,在非DST日期的中午检查时,在执行计算时不会获得额外的时间


虽然我知道大多数人会说,不要在数据库中以本地时间存储日期,而要以UTC时间存储日期,这样您就不会遇到这种情况,但并不是每个应用程序都有全球范围的用户,并不是每个程序员都想将系统中的每个日期转换为UTC,然后每次在数据库中执行GET或SET操作时再转换回来,并确定某个日期是本地的还是UTC格式的。

如果您想要00:00格式的时间: 我是这样解决的:

select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something

如果您希望在两天之间创建记录

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;

从数据集中选择count(col_Name)(julianday(“now”)-julianday(\u Last_updated)为int),因为您的日期格式如下:“YYYY-MM-DD HH:MM:SS”,
如果您需要查找两个日期的月数差异:


(strftime(“%m”,date1)+12*strftime(“%Y”,date1))-
(strftime('%m',date2)+12*strftime('%Y',date2))

在我的例子中,我必须以分钟为单位计算差值,
julianday()
没有给出准确的值。相反,我使用
strftime()

SELECT(strftime('%s',[UserEnd])-strftime('%s',[UserStart]))/60

两个日期都转换为unixtime(秒),然后减去以获得 两个日期之间以秒为单位的值。接下来,将其除以60


首先,不清楚您的日期格式是什么。 已经有一个答案涉及到strftime(“%s”)

我想进一步说明这个答案

SQLite只有以下存储类:NULL、INTEGER、REAL、TEXT或BLOB。 为了简化,我假设日期是真实的,包含自1970-01-01以来的秒数。 下面是一个示例模式,我将其放入“2018年12月1日”的示例数据中:

现在让我们计算一下“2018年12月1日”和现在(我写这篇文章时,是2018年12月12日正午)之间的日期差:

以天为单位的日期差异:

SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
以小时为单位的日期差异:

SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
以分钟为单位的日期差:

SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
以秒为单位的日期差:

SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0

如果你想在几秒钟内改变

SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')

请注意,尽管函数名可能会让人产生这样的想法,但它的粒度比days更高。这是一个天数,但可以是小数。请记住,julianday返回的是“天”的(小数)数,即从起始日期UTC中午开始的24小时周期。这通常不是你需要的,除非你正好住在格林威治以西12小时。例如,如果您住在伦敦,今天上午与昨天下午在同一个julianday。如果您的
DateCreated
是UTC格式,则此功能有效。相反,如果是当地时间,y