gpt4 book ai didi

php - 如何在 SQL 中解析日期?

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:52 25 4
gpt4 key购买 nike

我将日期以 varchar 格式存储在表中,如下所示:

2014-05-29

年月日

所以我认为对于使用 BETWEEN 选择,我可以去掉破折号 (20140529) 并像那样轻松地在两个日期之间进行选择。例如,日期 2014-01-01 和 2014-02-01 之间的日期将被视为 20140101 和 20140201,并且这些日期之间显然有一个数字范围可以匹配实际日期值,例如 20140115。

这是我计划在两个日期之间选择的 sql 查询(在 php 文件中):

$sql = mysql_query("Select * From $table Where Symbol = $symbol 
And (Concat(Parsename(Replace(Date, '-', '.'), 3), Parsename(Replace(Date, '-', '.'), 2), Parsename(Replace(Date, '-', '.'), 1))
Between Concat(Parsename(Replace($lowDate, '-', '.'), 3), Parsename(Replace($lowDate, '-', '.'), 2), Parsename(Replace($lowDate, '-', '.'), 1)) And
Concat(Parsename(Replace($highDate, '-', '.'), 3), Parsename(Replace($highDate, '-', '.'), 2), Parsename(Replace($highDate, '-', '.'), 1))))");

所以我在这里做的是使用 parsename 函数获取每个索引(它获取由点分隔的字符串,但首先用点替换破折号以使其起作用)。它应该按顺序获取年、月和日,然后将它们连接起来。

据我了解,它应该在每个日期都这样做;存储在表中的日期数据,然后是已经作为变量存储在 php 中的低日期和高日期(我想要数据)。然后它应该查看日期是否在最低日期和最高日期之间。我不确定为什么这不起作用,任何帮助都会很棒。

最佳答案

它不起作用,因为 PARSENAME 不是 MySQL 函数。如果要删除破折号,只需使用 REPLACE() 函数即可删除破折号。无需切断字符串并将其重新连接在一起。

REPLACE(mycol,'-','')

例如

WHERE REPLACE(mycol,'-','') BETWEEN '20140101' AND '20140430'

但由于字符串已经采用规范格式,因此没有必要删除破折号。也就是说,由于所有值均采用 YYYY-MM-DD 格式,长度恰好为 10 个字符以及两位数的月份和日期(带前导零),然后只需让您的谓词在裸列上运行...只需将其他“日期”值格式化为相同格式的字符串,例如

mycol BETWEEN '2013-12-01' AND '2014-02-15'

使用这种形式,因为谓词在裸 VARCHAR 列上,MySQL 应该能够利用适当的索引来执行范围扫描操作。

要将您的字符串转换为实际的 MySQL DATE,您可以这样做:

mycol + INTERVAL 0 DAY

您可以在 SQL 语句中使用该表达式,例如

mycol + INTERVAL 0 DAY BETWEEN '2013-12-15' AND '2014-03-31' 

(使用这种形式,因为谓词是在一个表达式上操作,而不是一个裸列,MySQL 优化器将无法使用范围扫描操作来满足谓词。左边的表达式的 BETWEEN 将需要对每一行进行评估(在评估此行之前不会被其他谓词排除。)

注意 MySQL 提供了一个DATE 数据类型,它是存储“日期”值的理想选择。在 VARCHAR 中存储“日期”值是一种反模式。

关于php - 如何在 SQL 中解析日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com