ฉันจะแทรกค่าวันที่และเวลาลงในฐานข้อมูล SQLite ได้อย่างไร


109

ฉันกำลังพยายามแทรกค่าวันที่และเวลาลงในฐานข้อมูลSQLite ดูเหมือนจะประสบความสำเร็จ แต่เมื่อฉันพยายามดึงค่ามีข้อผิดพลาด:

<ไม่สามารถอ่านข้อมูล>

คำสั่ง SQL คือ:

create table myTable (name varchar(25), myDate DATETIME)
insert into myTable (name,mydate) Values ('fred','jan 1 2009 13:22:15')

คำตอบ:


153

รูปแบบที่คุณต้องการคือ:

'2007-01-01 10:00:00'

เช่น yyyy-MM-dd HH: mm: ss

อย่างไรก็ตามหากเป็นไปได้ให้ใช้แบบสอบถามที่กำหนดพารามิเตอร์เนื่องจากจะช่วยให้คุณไม่ต้องกังวลเกี่ยวกับรายละเอียดการจัดรูปแบบ


One order by date กับสตริงดังกล่าวได้อย่างไร?
IgorGanapolsky

3
เมื่อคุณจัดรูปแบบวันที่เช่นนี้การเรียงลำดับวันที่และลำดับคำศัพท์จะทำงานเหมือนกัน เช่น '2008-02-01'> '2007-02-01', '2008-01-02'> '2008-01-01' ทั้งในรูปแบบสตริงและวันที่ แต่คุณไม่จำเป็นต้องสนใจเรื่องนี้อย่างเคร่งครัดเพราะ SQLite ORDER BY จะดูแลการสั่งซื้อให้คุณ
itowlson

7
โปรดทราบว่าคุณไม่สามารถเปรียบเทียบวันที่ที่มีความแม่นยำต่างกันได้อย่างน่าเชื่อถือโดยใช้การเรียงลำดับคำศัพท์เช่น "SELECT" 2007-01-02 10:00:00 ">" 2007-01-02 10:00 ";" คืนค่า 1 แต่ "SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');" ผลตอบแทน 0.
เชน

@itowlson วิธีนี้จะทำงานอย่างไรเมื่อคุณมีแอปพลิเคชันหลายภาษา
batmaci

46

วิธีการจัดเก็บวันที่ใน SQLite คือ:

 yyyy-mm-dd hh:mm:ss.xxxxxx

SQLite ยังมีฟังก์ชันวันที่และเวลาที่คุณสามารถใช้ได้ ดูSQL เป็นที่เข้าใจกันโดย SQLite, วันที่และเวลาฟังก์ชั่น


3
FYI .xxxxxxที่นี่ในไวยากรณ์ของ @ TorValamo = .SSS=% f ในเอกสาร SQLite คือเสี้ยววินาที
Flak DiNenno

2
DateTime.parse ('2016-05-28 14:27:00 -0300'). strftime ('% Y-% m-% d% H:% M:% S')
rodvlopes

17

คุณต้องเปลี่ยนรูปแบบของสตริงวันที่ที่คุณจัดหาเพื่อให้สามารถแทรกได้โดยใช้ฟังก์ชัน STRFTIME เหตุผลไม่มีตัวเลือกสำหรับตัวย่อเดือน:

%d  day of month: 00
%f  fractional seconds: SS.SSS
%H  hour: 00-24
%j  day of year: 001-366
%J  Julian day number
%m  month: 01-12
%M  minute: 00-59
%s  seconds since 1970-01-01
%S  seconds: 00-59
%w  day of week 0-6 with sunday==0
%W  week of year: 00-53
%Y  year: 0000-9999
%%  % 

อีกทางเลือกหนึ่งคือจัดรูปแบบวันที่ / เวลาเป็นรูปแบบที่ยอมรับแล้ว:

  1. ปปปป - ดด - วว
  2. YYYY-MM-DD HH: MM
  3. YYYY-MM-DD HH: MM: SS
  4. YYYY-MM-DD HH: MM: SS.SSS
  5. YYYY-MM-DDTHH: MM
  6. YYYY-MM-DDTHH: MM: SS
  7. YYYY-MM-DDTHH: MM: SS.SSS
  8. HH: มม
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. ตอนนี้

การอ้างอิง: ฟังก์ชัน SQLite Date & Time


แม้ว่าจะไม่ได้ระบุไว้ในตาราง แต่เอกสารยังระบุว่าคุณสามารถเพิ่ม "Z" หรือออฟเซ็ตเช่น "-0400" ได้
coolaj86

10

ใช้CURRENT_TIMESTAMPเมื่อคุณต้องการแทนNOW()(ซึ่งก็คือ MySQL)


1
มันได้ผลสิ่งหนึ่งที่ผิด CURRENT_TIMESTAMP ส่งคืนวันที่และเวลาโดยไม่มี UTC คุณรู้วิธีแก้ไขปัญหานี้หรือไม่ ขอบคุณล่วงหน้า!
Ulug'bek Ro'zimboyev

8

อ่านสิ่งนี้ : 1.2 Dateและประเภทข้อมูลเวลาประเภทข้อมูลที่ดีที่สุดในการจัดเก็บวันที่และเวลาคือ:

TEXT รูปแบบที่ดีที่สุดคือ: yyyy-MM-dd HH:mm:ss

จากนั้นอ่านหน้านี้ SQLiteนี้ที่ดีที่สุดคืออธิบายเกี่ยวกับวันและเวลาในการ ฉันหวังว่านี่จะช่วยคุณได้


5
คุณควรพิจารณาตอบคำถามโดยมีลิงก์ที่รองรับคำตอบของคุณไม่ใช่แค่ลิงก์มากมาย
อนซาโล

0

นี่อาจไม่ใช่วิธีที่ได้รับความนิยมหรือมีประสิทธิภาพมากที่สุด แต่ฉันมักจะละทิ้งประเภทข้อมูลที่คาดเดายากในSQLiteเนื่องจากพวกเขาทั้งหมดถูกถ่ายโอนข้อมูลเป็นสตริงอยู่ดี

ฉันเคยเขียน C # wrapper บาง ๆ รอบ ๆ ไลบรารี SQLite มาก่อน (แน่นอนเมื่อใช้ SQLite กับ C #) เพื่อจัดการการแทรกและการแยกเข้าและออกจาก SQLite ราวกับว่าฉันกำลังจัดการกับวัตถุ DateTime


ไม่ตัดสำหรับวันที่เช่นคุณต้องการจัดเรียงตามฟิลด์นั้น จบลงด้วยการเปรียบเทียบสตริง ...
G__
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.