如果信用卡的有效期只包含月份和年份,我该如何存储它?

14

如果信用卡的有效期仅由月份和年份组成,我该如何存储它?

MySQL中的日期字段接受以下格式:yyyy-mm-dd。使用该格式时,没有日期的有效期并不是无效的。

我是否应使用varchar类型?这样做是否会阻止我进行计算,以确定卡片何时过期等信息?


它总是只有一个月和一年吗?(我知道有些卡片上印有日期,但您需要存储日期吗?) - Random832
3
你知道存储信用卡数据是一个非常复杂的领域,甚至受到法律的监管,例如在美国?例如,请参见https://dev59.com/3XE95IYBdhLWcg3wmvCh。 - Pekka
与在数据库中存储信用卡数据相关的内容,请参考以下链接:https://dev59.com/UnA75IYBdhLWcg3wYH7I - Pekka
1
@Pekka,我知道,但不幸的是我没有选择。客户需要进行每月循环计费,而外包成本太高(不在美国)。网站上安装了SSL,并且所有卡号和CCV号码都使用AES加密。 - Mohamad
3个回答

16

您可以使用LAST_DAY函数来插入每月的最后一天。

例如:

SELECT LAST_DAY('2011-02-01')

将会得到今年的2011-02-28。通常情况下,您需要信用卡的当月最后一天,因为那是它实际有效的最后一天。


+1 我喜欢这个答案,因为它只需要在值保存时进行一次计算,然后可以将此值与任何日期进行比较,以查看卡是否已过期。 - ypercubeᵀᴹ
1
@ypercube:(a)你必须小心时间--真的应该与下个月的第一天进行比较,(b)零售商不应该确定卡片过期的时间;这是信用卡公司的权威。 - Jason S
@Jason:我完全同意你所说的一切。即使存储了月份的第一天,也无法确定到期时间。谁知道信用卡公司使用的是哪个时区? - ypercubeᵀᴹ
@Jason S:你说得对,零售商应该尝试使用信用卡,但如果失败了,最好提示:“您的信用卡支付失败:看起来可能已经过期了。” - Neil G

12

2014年1月:

2014-01-00

常见的做法是在月份和日期未知时使用00。引用自MySQL参考手册

 

有些日期函数可以与“零”日期或不完整日期一起使用,例如“2001-11-00”,而其他函数则不行。提取日期部分的函数通常与不完整的日期一起工作,因此可以返回0,而您可能期望的是非零值。例如:

  mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
      -> 0, 0
DATE_FORMAT的手册中,有关月份和日期格式说明符的范围从零开始,这是因为MySQL允许存储不完整的日期,例如“2014-00-00”。

5

在标准日期格式中,存储时只需使用每月的第一天。这样做有助于进行转换、比较等操作。


但是月份的第一天和月份本身是两个不同的概念。 - Jason S
此外,当设置了一个截止日期,例如2015年3月,而我们处于2014年3月15日时,它仍然是有效的。如果我们设置了月份的第一天,然后进行比较,3月15日大于3月1日,因此它不会在比较查询中有效。我宁愿将月份的第一天加上一个月的时间(这样2015年3月就变成了2015年4月1日)。但是,这样你就会失去原来的到期日期(只要知道你已经添加了一个月,就可以重新计算出它)。 - Unapedra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接