我有一个包含日期的数据库表
(`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00').
我正在使用MySQL。从程序中,有时数据会在没有日期的情况下传递到数据库。因此,日期值会自动分配给0000-00-00 00:00:00
当使用日期列调用表数据时,它会给出错误
...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......
我尝试将空值传递给插入数据的日期,但它会分配给当前时间。
有没有办法在不更改表格结构的情况下获得ResultSet
?
答案 0 :(得分:274)
您可以直接在数据源配置中使用此JDBC URL:
JDBC:MySQL的:// yourserver:3306 / yourdatabase zeroDateTimeBehavior = convertToNull
答案 1 :(得分:14)
“date”'0000-00-00“是否为有效”日期“与问题无关。 “只是改变数据库”很少是一个可行的解决方案。
事实:
因此,如果我“只是更改数据库”,数千行PHP代码将会中断。
Java程序员需要接受MySQL零日期和,当其他语言依赖此“功能”时,他们需要将零日期放回数据库。
连接MySQL的程序员需要处理null和0000-00-00以及有效日期。将0000-00-00变为null并不是一个可行的选择,因为那样你就不能再确定日期是否是用于写回数据库的日期。
For 0000-00-00,我建议将日期值检查为字符串,然后将其更改为(“y”,1)或(“yyyy-MM-dd”,0001-01-01),或者进入任何无效的MySQL日期(少于1000年,iirc)。 MySQL还有另一个“功能”:低日期会自动转换为0000-00-00。
我意识到我的建议是一个蠢货。但MySQL的日期处理也是如此。 并且两个kludges没有做对。事实是,许多程序员必须永远处理MySQL零日期 。
答案 2 :(得分:6)
不要使用0000-00-00 00:00:00
或0001-01-01 00:00:00
之类的假日期(后者应该被接受,因为它是有效日期),而是更改数据库架构,以允许NULL
值。
ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
答案 3 :(得分:6)
将以下语句附加到JDBC-mysql协议:
?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
例如:
jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
答案 4 :(得分:3)
作为一个外部转换,当您无法更改日期列或更新值时,或者在进行这些修改时,您可以使用case / when进行选择。
SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1;
答案 5 :(得分:1)
我解决了这个问题,并在上面接受的答案中实现了@Kushan提供的URL连接解决方案。它在我的本地MySql实例中工作。但是当我将我的Play / Scala应用程序部署到Heroku时,它不再有效。 Heroku还将几个args连接到他们为用户提供的DB URL,这个解决方案,因为Heroku使用了串联“?”在他们自己的一套args之前,将无法正常工作。然而,我发现了一种似乎同样有效的不同解决方案。
SET sql_mode = 'NO_ZERO_DATE';
我把它放在我的表格描述中,它解决了问题 '0000-00-00 00:00:00'不能表示为java.sql.Timestamp
答案 6 :(得分:1)
你可以试试这个
@webapp.route('/monitor', methods=['GET', 'POST'])
def monitor():
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# path = sys.argv[1] if len(sys.argv) > 1 else '.'
path = 'I:\\Projects\\files\\.'
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
return 'monitor script running'
答案 7 :(得分:0)
没有0000年,也没有00或00日。我建议你试试
0001-01-01 00:00:00
虽然在某些标准中定义了0年,但它更有可能比有用的恕我直言更令人困惑。
答案 8 :(得分:0)
将该字段强制转换为char
例如:cast(updatedate)as char as updatedate
答案 9 :(得分:0)
我知道这将是一个迟到的答案,但这是最正确的答案。
在MySQL数据库中,将timestamp
默认值更改为CURRENT_TIMESTAMP
。如果您的旧记录包含假值,则必须手动修复它们。
答案 10 :(得分:0)
如果没有必要,可以从mysql表中的列中删除“not null”属性。当你删除“not null”属性时,不需要“0000-00-00 00:00:00”转换,问题就消失了。
至少为我工作。
答案 11 :(得分:-2)
我相信这对于通过logstash抽取数据的人来说是完全有用的 错误:logstash.inputs.jdbc - 执行JDBC查询时出现异常{:exception =>#}
答案:jdbc:mysql:// localhost:3306 / database_name?zeroDateTimeBehavior = convertToNull“
或者如果你正在使用mysql