2012-08-30 65 views
0

我有一个任务是通过PHP从csv文件读取datetime并将它们存储在mysql数据库中。在csv文件中有两种格式的日期时间,第一种是DD/MM/YYYY HH:mm:ss AM/PM,第二种是MM-DD-YYYY HH:mm:ss AM/PM。然后,我需要选择一些行,因为它们的日期时间在某个时期。datetime for mysql和PHP

这似乎有点困惑。我的脑中有一些问题:

  1. 很容易在mysql表中设置varchar类型来存储它们。但它后来很难选择一些行,因为我需要将 字符串转换为datetime,并检查是否在特殊的 期间之间的数据。

  2. 另一种解决方案是将这些日期时间从字符串转换为 datetime由PHP存储到数据库中之前。然后很容易 以后选择数据。但第一步也有点复杂。

我不知道有人对这个问题有什么好的想法,或者有类似问题的经验。

+0

您可以将其作为时间戳存储。使用'strtotime()'并将其作为int(10)放入数据库中。 –

+1

'datetime'!='varchar' –

+0

确定您在决定是否要使用'datetime'或''datetime''之前阅读[本文](http://stackoverflow.com/questions/409286/datetime-vs-timestamp) int'。 – Kermit

回答

1

首先:永远不会有史以来永远将日期或日期时间作为字符串存储在数据库中。

从来没有。

明白了吗?

您应该始终将它们转换为数据库的内置datedatetime数据类型。

未能做到这一点将在以后非常困难地咬你。例如,假设试图让数据库按照日期顺序对它们进行排序,如果它们保存为字符串的话,尤其是如果它们的格式不同。如果有一件事你可以确定,那么当你在数据库中有一个日期时,你将需要基于给定日期之后或之前的条目来查询它。如果你不需要和他们一起做这种事情,那么把日期存储在第一位就没有太多意义,所以即使你还没有被要求这样做,也要考虑它是一个给定的它会在稍后被要求。因此,总是总是总是将它们存储在正确的数据类型中,而不是作为varchar。

接下来,您已被要求处理的格式混合。

这是疯狂。

我厌恶和厌恶PHP的strtotime()函数。它速度很慢,有一些不幸的怪癖,通常应该被认为是过去的遗产而没有被使用。但是,在这种情况下,它可能只是为了救援。

strtotime()旨在接受未知格式的日期字符串,解析它并输出正确的时间戳。显然,它必须处理dd-mm-yyyymm-dd-yyyy格式的存在。它通过查看分隔符来猜测你的意思。

如果日期字符串使用斜杠作为分隔符,则它假定格式为mm/dd/yyyy。如果它使用破折号,则它假定dd-mm-yyyy。这是在正常使用中使用strtotime()如此痛苦的那些小怪癖之一。但这里是你的朋友。

它的工作方式实际上与您在问题中指定的格式完全相反。但它应该足以帮助你。如果在输入字符串中切换斜杠和破折号,并将结果传递给strtotime(),则它应根据您在问题中描述的方式在所有情况下生成正确的时间戳。

它应该足够简单,可以将它们正确保存在数据库中。

但是,我会强烈建议非常彻底地测试。如果它突破某个位置,不会感到惊讶。如果您以不一致的格式提供数据,那么确实没有办法确保它始终不一致。你的程序基本上需要尽可能地利用错误的数据。

您还需要提出一些有关输入数据质量的严重问题。在这种情况下,预计任何程序都不能可靠地工作。清楚地告诉谁提供它不够好。如果程序因数据不好而中断,那是他们的错,而不是你的。

+0

谢谢各位。如果输入数据是统一的,该程序并不困难。由于数据不好,我不得不花费更多时间来解决问题。 – PhilipSong

+0

@PhilipSong - 我的建议是关于'strtotime()'的帮助呢? – Spudley

+0

是的。你的建议非常好。 – PhilipSong