【问题标题】:How to validate a user's date inputs when the validation criteria is stored in an SQL database当验证标准存储在 SQL 数据库中时如何验证用户的日期输入
【发布时间】:2014-05-19 22:07:22
【问题描述】:

我有下一张桌子:

| ID | Date-Start |Date-End|
| 01 | 2014-04-10 |2014-04-12|
| 02 | 2014-04-13 |2014-04-15|
| 03 | 2014-04-16 |2014-04-18|
| 04 | 2014-04-19 |2014-04-22|

用户选择 2 个日期,我需要验证这 2 个日期不与表中的日期交叉。 例如用户输入 2014-04-20 到 2014-04-21,这是无效的,因为在记录 04 中,这个范围是从 2014-04-19 到 2014-04-22。泰寻求帮助。请原谅我的英语不好。

【问题讨论】:

标签: php sql validation date range


【解决方案1】:
SELECT ID FROM table WHERE ((Date-Start >= '$first-date' AND Date-Start <= '$second-date')
 OR (Date-End >= '$first-date' AND Date-End <= '$second-date'))

如果它返回结果,那么给定的时间段应该是无效的

【讨论】:

  • 嗨 gbestard,请回复您,但是选择对我不起作用,因为如果我选择这个日期:2014-04-20 到 2014-04-21,选择不会像占用一样占用这个范围并且不返回任何内容,这应该是返回最后一条记录(| 04 | 2014-04-19 |2014-04-22|),ty
  • 如果它没有返回任何东西,那么给定的时期是好的
【解决方案2】:

使用伪代码:

SELECT COUNT(*) FROM `TABLE` WHERE `Date-Start` BETWEEN <start-date> AND <end-date> OR `Date-End` BETWEEN <start-date> AND <end-date>

然后你可以检查count是否>0。如果是,你就知道日期被占用了。

【讨论】:

  • 嗨 Samsquanch,请回复您,但选择对我不起作用,因为如果我选择这个日期:2014-04-20 到 2014-04-21,选择不会占用这个范围并返回0,这应该是返回最后一条记录(| 04 | 2014-04-19 |2014-04-22|),ty
【解决方案3】:

所以你可以这样做

(r1.dateEnd > r2.dateStart) and (r2.dateEnd > r1.dateStart) 

查看行是否重叠。例如查找重叠行

select * from DateTable r1, DateTable r2 
where (r1.dateEnd > r2.dateStart) and (r2.dateEnd > r1.dateStart) 

或使用查询查找重叠日期:

select * from DateTable r1
where ( r1.dateEnd >= {start_date} ) and ( {end_date} >= r1.dateStart ) 

【讨论】:

  • 嗨 Chrisky,对不起,我对 mysql 有点陌生,我不明白这是如何工作的,r1 和 r2 是什么?,以及我为用户 ty 提供的日期放在哪里
  • 对不起,我本来可以更清楚的。上面的示例在一个 DateTabe 中发现了重叠的条目 - 它的别名为 r1 和 r2。我已经编辑了答案。关键是要像我给出的那样进行比较 - 这涵盖了所有重叠的情况,例如当一个跨度完全包含另一个跨度时。如果您使用此处列出的其他类型的比较,您将不会遇到这种情况。
【解决方案4】:
SELECT * FROM table WHERE
 (( $fIni BETWEEN fechaIni AND fechaFin)
 OR ($fFin BETWEEN fechaIni AND fechaFin))

【讨论】:

  • 在您的答案中添加某些解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多