【问题标题】:query to get records based on small date from current date?查询以从当前日期开始根据小日期获取记录?
【发布时间】:2020-07-31 19:07:37
【问题描述】:

我在表格中有一个 loginDate 列。此列的值类型为Date。截至目前,我将 ISO 日期格式值存储为 2020-07-30 18:43:09.000000

现在我想编写一个查询,其中 logindate 的 monthyear 应该更小。假设当前日期30 July 2020,所以我只想获取较小月份和年份的记录。所以我不应该得到July 月的记录。我应该得到更小的月份和年份,例如。 2020 年 6 月、2019 年 7 月等。请告诉我应该查询什么。

我试过了

SELECT * FROM useres where loginDate < date_add(CURDATE(),INTERVAL 0 DAY) ;

但这也会得到 7 月的记录。

【问题讨论】:

  • 您指定类型为date,然后显示带有时间分量的值。 MySQL 不支持。

标签: javascript mysql sql typeorm


【解决方案1】:

您应该将日期拆分为monthyear。然后用这些创建一个新日期并供日用 1。然后简单地与当前日期进行比较。

WHERE
STR_TO_DATE( SUBSTR(loginDate,1,10 ), '%Y-%m-%d')
<
STR_TO_DATE( 
CONCAT( 
    YEAR( CURRENT_DATE() ), '-', 
    LPAD( MONTH( CURRENT_DATE() ) ,2,'00'),
    '-01'   )
,'%Y-%m-%d' )

【讨论】:

  • loginDate 放在表达式的中间可以防止任何索引的使用。同时将日期视为字符串有点丑陋。
【解决方案2】:

替代日期表达式:

所以上个月是:

WHERE last_day(curdate() - interval 2 month)+ interval 1 day <= login_date AND
 login_date < curdate() - interval (day(curdate())-1) day

上一年的当前月份是:

WHERE last_day(curdate() - interval 1 year - interval 1 month) + interval 1 day <= login_date AND
 login_date < curdate() - interval (day(curdate())-1) day - interval 1 year

【讨论】:

    【解决方案3】:

    我想你想要:

    where login_date < curdate() + interval (1 - day(curdate()) day
    

    这会获取当月第一个日期之前的所有行。

    【讨论】:

    • 如果日期是 01-07-2020 那么这个逻辑就行不通了。
    • 您确实说过列类型是Date,这与我们在问题中包含时间的 ISO 日期格式相矛盾。如果您将日期存储为文本,那么您将遇到需要解决的问题。日期的代表与日期不同。
    • 如果日期是 01-07-2020 那么这个逻辑将不起作用。 2020-07-30 18:43:09.000000
    • @TechChain 。 . .如果日期是 2020-07-01,那么这将选择 2020-07-01 之前的所有内容。如果日期是 2020-07-31,那么它也会选择 2020-07-01 之前的所有内容。这似乎是问题所要求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多