【问题标题】:Selecting data using mm/dd/yyyy format in MySQL在 MySQL 中使用 mm/dd/yyyy 格式选择数据
【发布时间】:2020-07-31 01:34:18
【问题描述】:

我有下表结构。

Tax      |   FromDate    |   EndDate
12.32    |   12-29-2020  |   12-29-2021

税率 12.32 从FromDateEndDate 有效。指定FromDateEndDate 之间的日期范围时应选择12.32。

我尝试了以下查询,但是通过 @startdate@enddate 时它没有给我有效的输出。

SELECT Tax
FROM Table
WHERE
  DATE_FORMAT(@startDate, '%m-%d-%y') >= DATE_FORMAT(t.fromDate, '%m-%d-%y')
  AND DATE_FORMAT(@endDate, '%m-%d-%y') <=  DATE_FORMAT(t.endDate, '%m-%d-%y')  LIMIT 1;

目前,我使用 VARCHAR(45) 作为列的 DataType 以及输入参数值的 DataType。我选择了 VARCHAR(45),因为在处理 mm-dd-yyyy 时使用 DATE 类型会引发错误。

我哪里出错了?

下面是示例代码。

SET @startDate = '07-29-2019';
SET @endDate = '09-29-2019';

DROP TEMPORARY TABLE IF EXISTS Dates;
CREATE TEMPORARY TABLE Dates (StartDate VARCHAR(20),EndDate VARCHAR(20),Tax INT);
INSERT INTO Dates VALUES ('06-29-2019','06-29-2020',1);

SELECT *
FROM Dates
WHERE
STR_TO_DATE(@startDate, '%m-%d-%y') <= STR_TO_DATE(EndDate, '%m-%d-%y')
AND STR_TO_DATE(@endDate, '%m-%d-%y') >= STR_TO_DATE(StartDate, '%m-%d-%y')

根据上面的代码,它应该返回一行。但它没有返回。

【问题讨论】:

  • 当我们决定(不明智地)将日期值存储在 VARCHAR 而不是 DATE 数据类型中时,我们开始偏离轨道...... SQL 语法 trainwreck 是该决定的结果。 (该问题的解决方法是弄清楚如何将日期存储到 DATE 列中。)参考:dev.mysql.com/doc/refman/8.0/en/datetime.html
  • SELECT STR_TO_DATE( '12-29-2020' ,'%m-%d-%Y') AS date_val
  • INSERT INTO my_table ( date_col ) VALUES ( STR_TO_DATE( '12-29-2021' ,'%m-%d-%Y') )
  • 您的案例已经有 2 个 cmets。将y 更改为Y

标签: mysql sql date where-clause date-format


【解决方案1】:

你想要STR_TO_DATE(),而不是DATE_FORMAT()。后者将日期转换为给定的字符串格式,而前者将格式化的日期字符串转换为日期(据我了解,您的问题是您正在寻找的):

SELECT Tax
FROM Table
WHERE
  STR_TO_DATE(@startDate, '%m-%d-%Y') >= STR_TO_DATE(t.fromDate, '%m-%d-%Y')
  AND STR_TO_DATE(@endDate, '%m-%d-%Y') <=  STR_TO_DATE(t.endDate, '%m-%d-%Y')  
ORDER BY ?
LIMIT 1;

请注意,您应该在查询中添加ORDER BY 子句,以便LIMIT 有意义(否则,如果谓词允许多行,则未定义将返回哪一行)。

我也不确定WHERE 子句。如果您想要在给定日期范围参数内有效的税款,则应该是:

WHERE
  STR_TO_DATE(@startDate, '%m-%d-%Y') <= STR_TO_DATE(t.endDate, '%m-%d-%Y')
  AND STR_TO_DATE(@endDate, '%m-%d-%Y') >= STR_TO_DATE(t.startDate, '%m-%d-%Y')

【讨论】:

    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2021-12-18
    相关资源
    最近更新 更多