关于日期时间查询的sqlite

时间:2018-05-07 22:06:23

标签: javascript sql sqlite

帮我解决这个问题。

我有一些数据存储在DB中,以毫秒为单位。但这不是我想要的格式,因此我将其转换为实际的日期格式。格式在运行时期间作为新列更新。 strftime(MillisField*1000,'%Y %m %d %H:%M:%s')作为日期。

这将在新列中返回实际的日期和时间格式。

但问题是如果我想要一些特定数据的最后六个月,所以我尝试了这个:

MillisField > 2017-12-01

它没有向我显示过去六个月的数据, 但是,如果我试试这个:

MillisField > 1512066600000

它显示了我想要的确切结果,但我不想在几毫秒内给出,我需要它以日期格式。

1 个答案:

答案 0 :(得分:0)

2017-12-01 = 2004 ,即没有引号是数字因此,从2017年减去01和12,因此结果是2004年小于1512066600000。

'2017-12-01'是一个字符串,会导致比较结果不一致。

你需要做的是确保你比较喜欢而不是苹果和橘子的口语比较。

以下内容可能有助于您更好地了解如何进行比较以及如何进行比较

  • 两个给定日期2017-12-01(以毫秒为单位进行测试)和2000-01-01(在millis数据之前进行测试)。

: -

SELECT
    date('2000-01-01') AS date001,
    date('2017-12-01') AS date002,

    datetime('2000-01-01') AS dattim001,
    datetime('2017-12-01') AS dattim002,

    strftime('%s','2000-01-01') AS secs_date001, --  946684800
    strftime('%s','2017-12-01') AS secs_date002, -- 1512086400 (2017-11-30 18:30:00)

    datetime(1512066600,'unixepoch') AS comparison_as_date,

-- Is 946684800 (2000-01-01) > 1512066600 (2017-11-30) (NO but!!)
    datetime('2000-01-01') > 1512066600 AS compare001, -- 1 = true = yes (WRONG)
    CAST(datetime('2000-01-01') AS INTEGER) > 1512066600 AS compare002, -- 0 = false = no  (CORRECT)
    datetime('2000-01-01') > datetime(1512066600,'unixepoch') AS compare003, -- 0 = false = no (CORRECT)
    strftime('%s','2000-01-01') > 1512066600 AS compare004, -- 1 = true = yes (WRONG)
    CAST(strftime('%s','2000-01-01') AS INTEGER) > 1512066600 AS compare005, -- 0 = false = no (CORRECT)

-- Is 1512086400 (2017-12-01) > 1512066600000 (2017-11-30) (YES but!!)
    datetime('2017-12-01') > 1512066600 AS compare101, -- 1 = true = yes (CORRECT)
    CAST(datetime('2017-12-01') AS INTEGER) > 1512066600 AS compare102, -- 0 = false = no  (WRONG) 
    datetime('2017-12-01') > datetime(1512066600,'unixepoch') AS compare103, -- 1 = true = yes (CORRECT)
    strftime('%s','2017-12-01') > 1512066600 AS compare104, -- 1 = true = yes (CORRECT)
    CAST(strftime('%s','2017-12-01') AS INTEGER) > 1512066600 AS compare105 -- 1 = true = yes (CORRECT)

因此: -

  • compare001 / 101,compare002 / 102和compare004 / 104并不总能返回正确的结果
  • compare003 / 103和compare005 / 105方法是一致的

datetime('2000-01-01') > datetime(1512066600,'unixepoch')

CAST(strftime('%s','2000-01-01') AS INTEGER) > 1512066600

可靠(即他们将不同的格式转换为兼容的格式进行比较)

上述SQL的结果

以上产生(分为2显示): - enter image description here enter image description here