ฉันมีเลเยอร์ที่มีจุดซึ่งแสดงถึงอุบัติเหตุบนท้องถนนที่ร้ายแรงและฟิลด์ "date_14_D" มีวันที่ แต่ประเภทของมันคือสตริง ฉันต้องการแปลงฟิลด์สตริงเป็นฟิลด์วันที่ แต่ปุ่มตกลงไม่ทำงาน มีปัญหาอะไร? ฉันใช้ QGis ดูภาพด้านล่าง
ฉันมีเลเยอร์ที่มีจุดซึ่งแสดงถึงอุบัติเหตุบนท้องถนนที่ร้ายแรงและฟิลด์ "date_14_D" มีวันที่ แต่ประเภทของมันคือสตริง ฉันต้องการแปลงฟิลด์สตริงเป็นฟิลด์วันที่ แต่ปุ่มตกลงไม่ทำงาน มีปัญหาอะไร? ฉันใช้ QGis ดูภาพด้านล่าง
คำตอบ:
ฉันประหลาดใจที่ฉันไม่เคยเห็นสิ่งนี้มาก่อน บางทีฉันอาจมองเห็นสิ่งที่ชัดเจน :)
แม้ว่าคุณจะใช้ภาษาอื่นกับฉันคุณกำลังใช้รูปแบบวันที่เดียวกับที่ฉันทำในสหราชอาณาจักร dd / MM / yyyy ฉันพบข้อผิดพลาดเล็กน้อย (ใน QGIS 2.16.1) แต่ไม่ชอบรูปแบบวันที่ดังกล่าว
คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการสร้างสคริปต์ไพ ธ อนสั้น ๆ ในแท็บฟังก์ชั่นแก้ไขของตัวแก้ไขนิพจน์
from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import QDate
@qgsfunction(args="auto", group='Python')
def parse_date_dmy(fromval, feature, parent):
return QDate.fromString(fromval, 'dd/MM/yyyy')
หากคุณใช้ QGIS 3 # และรับข้อผิดพลาดเกี่ยวกับ PyQt4 ให้ใช้ PyQt5 แทนเช่นแทนที่บรรทัด 3 ด้วย
...
from PyQt5.QtCore import QDate
...
จากนั้นคุณสามารถป้อนนิพจน์เช่นนั้นโดยใช้ชื่อฟิลด์ของคุณ: -
parse_date_dmy("mydate")
หากทุกอย่างดีคุณควรเห็นสิ่งนี้ ...
หรือเพียงใช้:
to_date( regexp_substr( "MAJ" , '/(\\d+$)' ) || '-' || regexp_substr( "MAJ" , '/(\\d+)/' ) || '-' || regexp_substr( "MAJ" , '^(\\d+)/' ) )
ด้วย MAJ เป็นฟิลด์วันที่ของคุณ (dd / MM / YYYY)
การอัปเดตสำหรับ QGIS 3 ของคำตอบที่ชัดใสโดย @Steven Kay
คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการสร้างสคริปต์ไพ ธ อนสั้น ๆ ในแท็บฟังก์ชั่นแก้ไขของตัวแก้ไขนิพจน์
from qgis.core import *
from qgis.gui import *
from PyQt5.QtCore import QDate
@qgsfunction(args="auto", group='Python')
def parse_date_dmy(fromval, feature, parent):
return QDate.fromString(fromval, 'dd/MM/yyyy')
จากนั้นคุณสามารถป้อนนิพจน์เช่นนั้นโดยใช้ชื่อฟิลด์ของคุณ: -
parse_date_dmy("mydate")
หากทุกอย่างดีคุณควรเห็นสิ่งนี้ ...
ฉันไม่รู้ว่ามันเป็นอย่างไรในปี 2559 แต่จาก QGIS 3.10 สิ่งนี้ถูกนำไปใช้ในฟังก์ชั่นที่มีอยู่ใน QGIS ในเครื่องมือแก้ไขการแสดงออกหรือเครื่องคำนวณภาคสนาม เอกสารทางด้านขวา (ในกล่องโต้ตอบการคำนวณภาคสนาม) จะช่วยให้คุณแก้ปัญหาของ:
to_date( "MyDateFieldNameWithDatesAsStrings" , 'dd/MM/yyyy' )
(ช่องว่างเป็นทางเลือก) และกด "ตกลง" ปรับ "รูปแบบ" เป็นสิ่งที่มีอยู่ในตารางแอตทริบิวต์ของคุณ ตัวอย่างเช่นหากวันที่ของคุณดูเหมือนสิ่ง07.3.03
ที่ถูกต้องรูปแบบที่ถูกต้องสำหรับนั้นจะเป็นdd.M.yy
* ให้ความสนใจกับตัวพิมพ์ใหญ่เนื่องจากสัญลักษณ์m
ย่อมาจาก "นาที" และM
หมายถึง "เดือน"