MySQL में एक पायथन डेटाटाइम.टाइमटाइम ऑब्जेक्ट सम्मिलित करना


120

मेरे पास एक MySQL तालिका में एक तिथि स्तंभ है। मैं datetime.datetime()इस कॉलम में ऑब्जेक्ट डालना चाहता हूं । मुझे निष्पादित कथन में क्या उपयोग करना चाहिए?

मैंने कोशिश की है:

now = datetime.datetime(2009,5,5)

cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))

मुझे एक त्रुटि मिल रही है: "TypeError: not all arguments converted during string formatting" मुझे इसके बजाय क्या उपयोग करना चाहिए %s?


आप के आसपास उद्धरण याद किया%s cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , '%s')",("name", 4,now))
Sheshnath

जवाबों:


198

समय क्षेत्र के लिए, उपयोग करें:

import time    
time.strftime('%Y-%m-%d %H:%M:%S')

मुझे लगता है कि स्ट्रेटटाइम भी डेटाइम पर लागू होता है।


4
यह भी सुनिश्चित करें कि आपका कॉलम नाम आरक्षित शब्द नहीं है । "Current_date" नाम का एहसास करने के लिए मुझे 30 मिनट का समय लगा, जिससे समस्याएँ पैदा हो रही थीं ... उह!
पाकमन

2
timeइस उदाहरण में क्या है ?
जेम्स मैकमोहन

1
जे मैकमोहन: समय एक पायथन मॉड्यूल है।
dstromberg

क्या होगा अगर कोई केवल वर्ष, महीना, दिवस प्राप्त करना चाहता है?
पूजा खत्री

42

आपको सबसे अधिक संभावना TypeError मिल रही है क्योंकि आपको datecolumn मान के उद्धरणों की आवश्यकता है।

प्रयत्न:

now = datetime.datetime(2009, 5, 5)

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
               ("name", 4, now))

प्रारूप के संबंध में, मुझे उपरोक्त आदेश (जिसमें मिलीसेकंड भी शामिल है) और उसके साथ सफलता मिली:

now.strftime('%Y-%m-%d %H:%M:%S')

उम्मीद है की यह मदद करेगा।


8
आप के आसपास उद्धरण नहीं हो सकता है %sमें pymsql
मार्टिन थोमा

1
जब मैं यह प्रयास करता हूं, तो तीसरे% के आसपास त्रुटि होती है।
असली नागा

13

now.date()एक के Dateबजाय एक वस्तु प्राप्त करने के लिए उपयोग करने का प्रयास करें DateTime

यदि वह काम नहीं करता है, तो उसे एक स्ट्रिंग में परिवर्तित करना चाहिए:

now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))

क्या आपको स्ट्रिंग मापदंडों के आसपास उद्धरण जोड़ने की आवश्यकता नहीं है "" ... VALUES ('% s', '% s', '% s') "
गैरेथ सिम्पसन

5

पायथन विधि का प्रयोग करें datetime.strftime(format), जहाँ प्रारूप = '%Y-%m-%d %H:%M:%S'

import datetime

now = datetime.datetime.utcnow()

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
               ("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))

समय क्षेत्र

यदि टाइमज़ोन एक चिंता का विषय है, तो MySQL timezone UTC के लिए सेट किया जा सकता है:

cursor.execute("SET time_zone = '+00:00'")

और समयक्षेत्र पायथन में सेट किया जा सकता है:

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)

MySQL प्रलेखन

MySQL इन स्वरूपों में DATETIME और TIMESTAMP मूल्यों को पहचानता है:

या तो 'YYYY-MM-DD HH: MM: SS' या 'YY-MM-DD-HH: MM: SS' प्रारूप में एक स्ट्रिंग के रूप में । एक "आराम" सिंटैक्स की अनुमति यहाँ भी है: किसी भी विराम चिह्न चरित्र का उपयोग दिनांक भागों या समय भागों के बीच परिसीमन के रूप में किया जा सकता है। उदाहरण के लिए, '2012-12-31 11:30:45', '2012 ^ 12 ^ 31 11 + 30 + 45', '2012/12/31 11 * 30 * 45', और '2012 @ 12 @ 31 11 ^ 30 ^ 45 'बराबर हैं।

एक तारीख और समय भाग और एक अंश सेकंड के बीच मान्यता प्राप्त एकमात्र सीमांकक दशमलव बिंदु है।

दिनांक और समय भागों को एक स्थान के बजाय T से अलग किया जा सकता है। उदाहरण के लिए, '2012-12-31 11:30:45' '2012-12-31T11: 30: 45' समकक्ष हैं।

या तो a YYYYMMDDHHMMSS ’या Y YYMMDDHHMMSS’ फॉर्मेट में कोई सीमांकक नहीं है, बशर्ते कि स्ट्रिंग एक तारीख के रूप में समझ में आता है। उदाहरण के लिए, '20070523091528' और '070523091528' की व्याख्या '2007-05-23 09:15:28' के रूप में की गई है, लेकिन '071122129015' गैरकानूनी है (इसमें एक निरर्थक मिनट वाला हिस्सा है) और '0000-00-00 00' बन जाता है: 00:00 '।

YYYYMMDDHHMMSS या YYMMDDHHMMSS प्रारूप में एक संख्या के रूप में, बशर्ते कि संख्या एक तारीख के रूप में समझ में आती है। उदाहरण के लिए, 19830905132800 और 830905132800 की व्याख्या '1983-09-05 13:28:00' के रूप में की जाती है।


3

आप किस डेटाबेस से जुड़ रहे हैं? मुझे पता है कि ओरेकल तारीख प्रारूपों के बारे में पसंद कर सकता है और आईएसओ 8601 प्रारूप पसंद कर सकता है ।

** नोट: उफ़, मैंने अभी पढ़ा है कि आप MySQL पर हैं। बस दिनांक को प्रारूपित करें और परीक्षण के लिए एक अलग प्रत्यक्ष SQL कॉल के रूप में प्रयास करें।

पायथन में, आप एक आईएसओ तिथि प्राप्त कर सकते हैं जैसे

now.isoformat()

उदाहरण के लिए, Oracle को दिनांक पसंद हैं

insert into x values(99, '31-may-09');

आपके डेटाबेस के आधार पर, यदि यह Oracle है, तो आपको इसे TO_DATE तक करने की आवश्यकता हो सकती है:

insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

TO_DATE का सामान्य उपयोग है:

TO_DATE(<string>, '<format>')

यदि किसी अन्य डेटाबेस का उपयोग कर रहे हैं (मैंने कर्सर देखा और ओरेकल सोचा; मैं गलत हो सकता है) तो उनके दिनांक प्रारूप टूल की जांच करें। MySQL के लिए यह DATE_FORMAT () और SQL सर्वर है यह CONVERT है।

SQLAlchemy जैसे टूल का उपयोग करने से भी इन जैसे अंतर दूर हो जाएंगे और आपका जीवन आसान हो जाएगा।


मैं datetime.isoformat () का उपयोग करने की अनुशंसा नहीं करता हूं क्योंकि यदि आप टाइमजोन जागरूक वस्तु का उपयोग करते हैं, तो उत्पन्न स्ट्रिंग में टाइमज़ोन डेटा शामिल है और अब आवश्यक mysql प्रारूप से मेल नहीं खाता है।
18

0

यदि आप सिर्फ एक अजगर डेटटाइम (एक पूर्ण डेटाइम लाइफटाइम नहीं) का उपयोग कर रहे हैं, तो एक तार के रूप में तारीख डालें। यह बहुत सरल है और मेरे लिए काम करता है (mysql, python 2.7, Ubuntu)। स्तंभ published_dateएक MySQL दिनांक फ़ील्ड है, अजगर चर publish_dateहै datetime.date

# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
    "link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
    "VALUES(%s, %s, %s, %s, %s, %s, %s) ;"

sql_data = ( title, link, str(publish_date), \
             author, posted_by, \
             str(coco_id), str(link_id) )

try:
    dbc.execute(sql_stmt, sql_data )
except Exception, e:
    ...

0

जब टी-वर्ग में iserting है

यह विफल रहता है:

select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)

यह काम:

select CONVERT(datetime,'2019-09-13 09:04:35.823',21)

आसान तरीका:

regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
    """Converts the datetime object to Splunk isoformat string."""
    # 6-digits string.
    microseconds = regexp.search(dt).group(1)
    return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.