如题,最近遇到几个链接 mssql 数据库功能, 使用 pymsql 进行 sql 语句拼接。 pymsql 获取的时间直接变成 datetime 类型,毫秒位数比较多,
比如 2018-08-22 12:12:56.2888 我将其转为字符串方法:
先返回时间字符串+"."+毫秒字符串[:3 ] 直接插入 sql 语句报错,sql 查询时间毫秒是三位 如 2018-12-12 23:14:25.200 ,所以做了截取。
总感觉这种方法不合适,有没有比较好的方法。
#if len(str1)>23:
# str1=str1[:23]
sql=” select * from A where time1=‘“+str1+”‘“
#sql 语句 select * from A where time1=’ 2018-08-25 15:32:41.291339 ‘
#正确语句 select * from A where time1=’ 2018-08-25 15:32:41.291 ‘
增加我生成sql语句代码
1
anonymous256 2018-08-24 23:30:23 +08:00 via Android
不太清楚你的意思,好像是字符串中小数位数的保留的问题,4 位改成三位,截短。
如果是这样的话,可以是使用 format()字符串格式化方法。 如: '{0:<23}'.format('2018-08-22 12:12:56.2888') 0 对应这个字符串 :表示格式 <表示左对齐 23 表示字符串保留的长度。 format 的功能比较强大,你可以搜下相关的博文,查具体的用法。 |
2
qile1 OP @anonymous256 多谢回复,我具体应用场景是:从数据库 查询修改时间:2018-07-27 11:17:51.327
然后把时间作为数据库查询字段进行再次查询。 当我使用 pymsql 获取到的时间是 “ 2018-08-25 15:32:41.291339 ” 正常数据库时间是 2018-08-25 15:32:41.291 当我直接构建查询语句 ···· str1=datetime.datetime.now() #if len(str1)>23: # str1=str1[:23] sql=” select * from A where time1=‘“+str1+”‘“ #sql 语句 select * from A where time1=’ 2018-08-25 15:32:41.291339 ‘ #正确语句 select * from A where time1=’ 2018-08-25 15:32:41.291 ‘ ···· 此 sql 执行报错 我现在是用条码判断语句直接截取,感觉方式不对,特来问问有啥好办法 ···· if len(str1)>23: str1=str1[:23] ···· |
3
anonymous256 2018-08-25 17:09:03 +08:00 via Android
if len(str1)>23:
上面这条语句是不能执行的。datetime.datetime 类型的对象,是没有 len 方法的,这么执行你讲得到异常:"TypeError"。 1. 不过你可以把 datetime 对象转化为 str,然后我用切片进行截短。例如 len(str(str1))是可行的,但这样就不太优雅了。 2. 如果是想获得字符串格式的时间,建议: str1 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S:%f) cursor.excute(' select * from A where time1={}'.format(str1)) 这样子是可行的。如果精度要求不高。 如果 str1 你总是想保留后面三位小数,那么比如截取重新生成一个。 #1 更正: 我在 1 楼关于 format 的用法有误{0:23}.format()是针对数字操作的,不能想当然也处理 str |
4
anonymous256 2018-08-25 17:28:33 +08:00 via Android
更正如下:
str1 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S) cursor.excute(' select * from A where time1={}'.format(str1)) 说明: str1 中的%f 忘了去掉。 没有测试 mysql 是否支持五位数小数%f,理论上是支持的,楼主自行测试一下。 |