【问题标题】:Get 5 nearest dates to today using SQLite使用 SQLite 获取距今天最近的 5 个日期
【发布时间】:2012-02-08 23:23:50
【问题描述】:

我在 SQLITE 中有一个使用以下结构的数据库/表

CREATE TABLE milestones ( 
    ID       INT( 10 )        NOT NULL,
    Title    VARCHAR( 50 )    DEFAULT NULL,
    mYear    INT( 11 )        NOT NULL,
    mMonth   INT( 11 )        DEFAULT NULL,
    mDay     INT( 11 )    DEFAULT NULL,
    mText    VARCHAR( 2000 )  NOT NULL,
    Theme1   VARCHAR( 50 )    DEFAULT NULL,
    Theme2   VARCHAR( 50 )    DEFAULT NULL,
    ImageURL VARCHAR( 50 )    DEFAULT NULL,
    PRIMARY KEY ( ID ) 
);

我正在使用以下查询来获取与今天日期最近的 5 个日期。

SELECT dtable.ID, dtable.Date 
FROM(SELECT ID, date(mYear||'-'||mMonth||'-'||mDay) as Date 
FROM milestones
WHERE mMonth IS NOT NULL AND mDay IS NOT NULL AND mMonth ="+varMonth+")AS dtable
ORDER BY ABS("+varDay+"-date(dtable.Date, '%d'))
LIMIT 5;

使用此查询的问题是我只能获取日期格式为 yyyy-mm-dd 的记录。 如果有任何包含 1 位数月份或日期的记录(格式 yyyy-m-d 或 yyyy-mm-d 或 yyyy-m-dd),则它不会显示在结果中。

如何在不更改 mMonth 或 mDay 的数据类型的情况下解决此问题?

【问题讨论】:

  • 你为什么不用 Javascript 来做这个?
  • 你的问题是如何在 SQL 中做到这一点我说你应该在 Javascript 中做到这一点
  • @Toby:不使用 Javascript 的明显原因是您必须将整个表格下载到 javascript 中才能进行比较...

标签: javascript html sql sqlite


【解决方案1】:

如果你想用零填充一个字符串以确保它是 2 字符宽,你可以使用这个简单的小技巧和几个 SQLite 内置可用函数:

SUBSTR('00'||month,-2)

【讨论】:

  • 这解决了2位数格式的问题。但是,它没有按照我想要的方式排序。这是从日期 date(dtable.Date, '%d') 获取日期数的正确方法
  • 我找到了方法:strftime('%d', dtable.Date)
【解决方案2】:

我认为您没有获得单个数字月份的匹配的一个潜在原因是因为您的 +varMonth+ 本身被格式化为例如“04”。您可能将它们视为字符串,并且发生了隐式 (string)int 强制转换,因此“4”=“04”不匹配。 不知道为什么这也会影响 +varDay+,因为我会假设减法会被转换回 int,所以像 (int)((string)int) 这样的事情正在发生。

你能排除这个吗?

我还在这里看到一个缺陷,即“最近 5 个日期”仅限于当月,所以如果今天是当月的第一天/最后一天,您仍然只能在当月获得结果。

试试这个查询:

SELECT dtable.ID, dtable.Date  
FROM (SELECT ID, date(mYear||'-'||mMonth||'-'||mDay) as Date  
FROM milestones WHERE mMonth IS NOT NULL AND mDay IS NOT NULL) AS dtable 
ORDER BY ABS(date("+varYear+"||'-'||"+varMonth+"||'-'||"+varDay+") - dtable.Date) ASC  
LIMIT 5;

【讨论】:

  • "我还看到一个缺陷,即“最近 5 个日期”仅限于当前月份,因此如果今天是该月的第一天/最后一天,您仍然只能在这个月。”我知道这一点,这对我的目的来说很好。
  • 啊好的,所以它的目的是“给定月份内最近的 5 个日期”,在这种情况下,您可以将 AND mMonth="+varMonth+" 放回去。
  • "你的 +varMonth+ 本身被格式化为 "04""我仍然认为这不是问题。我使用特定数字代替 +varMonth+ 并且仍然得到相同的结果。
猜你喜欢
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多