2016-03-25 13 views
3

kimlik ve yayınlama_tarihi adında 2 sütun var. publish_date, varchar biçimindedir (ör. 2015-11-08 20:11:59). Sonuçları aylığa göre filtrelemek için şu kodu kullandım:Tarih değiştiğinde mysql içinde filtre ay

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%d/%m/%Y')) = 11 

MySQL boş bir sonuç kümesi döndürdü. Neler oluyor? Sorgunuzun olarak

+0

Karşılaştırmanın sol tarafındaki ifade NULL döndürüyor. Ve NULL asla "on bir eşit" değil. Ve bu ifade, NULL döndürüyor çünkü bu, DATETIME olarak dizge değerinin dönüşümünün sonucudur, çünkü belirtilen biçim (STR_TO_DATE için ikinci argüman olarak) strnig değerinin biçimi ile eşleşmiyor. MySQL dizeyi DATETIME olarak değiştiremez. – spencer7593

cevap

2

, sen ikinci argüman verilen tarih biçimini olması gerekiyordu görürdük.

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_str-to-date

o zaman formatında

2015-11-08 20:11:59 

nedenle biçim dizesi taşımaktadır '%Y-%m-%d %h:%i:%s'

+0

Ooops. '% Y /% m% d' biçimini yazmak istedim. Ama evet, '/' yerine '-' kullanmalıydım. Bu, boş bir karnın üzerinde çalışırken neler oluyor: (Her neyse, cevap veren herkese teşekkür ederim.) –

1

, bugüne kadar varchar tarihi dönüştürdüğünüzde ('% Y-% m-% d' 2015-11-08 için)

benim gibi sütunda kullanılan bu biçimi verebilir Eğer fonksiyon kılavuzuna verseydi sizin PUBLISH_DATE varsayılmaktadır (2015/11/08) biçiminde yyyy-mm-dd

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%Y-%m-%d')) = 11; 
0

Karakteriniz bir zaman damgası biçimi belirtmek gerekir varchar giriş 2015-11-08 20:11:59 olduğunu iseniz size hangi STR_TO_DATE()'a geçmek

%Y-%m-%d %h:%i:%s 

SELECT * 
FROM 'table' 
WHERE MONTH(STR_TO_DATE(publish_date, '%Y-%m-%d %h:%i:%s')) = 11 
olmalıdır

Çeşitli türde dizeleri kullanma ile ilgili belgeler için TechOnTheNet'u tercih ederim.

3

TIMESTAMP() kullanarak bir çözüm.

SELECT * FROM `table` WHERE MONTH(TIMESTAMP(publish_date)) = 11 

Demo: STR_TO_DATE belirtilen

mysql> select MONTH(TIMESTAMP('2015-11-08 20:11:59')); 
+-----------------------------------------+ 
| MONTH(TIMESTAMP('2015-11-08 20:11:59')) | 
+-----------------------------------------+ 
|          11 | 
+-----------------------------------------+ 
1 row in set (0.00 sec) 
0

biçimi publish_date biçimini eşleşmiyor.

(publish_date bir DATETIME sütun olarak tanımlı değil neden herhangi bir sebep? Var mı)

Testi farklı bir biçim, senin dizeleri biçimine uyan birini kullanarak dönüşüm ...

SELECT STR_TO_DATE(publish_date,'%Y-%m-%d %T') 
    FROM `table` 
    LIMIT 10 

Bu ikinci argümanın STR_TO_DATE işlevinin belirli bir anlamı vardır. Bu sadece anlamsız bir karmakarışık değil. ,

MONTH(publish_date) = 11 

Ama kişisel olarak, ben STR_TO_DATE fonksiyonu içerir: PUBLISH_DATE dizesinin biçimi göz önüne alındığında

http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format

işlevi STR_TO_DATE açık referans ihmal olabilir, MySQL DATETIME için varsayılan biçimi maçları dönüşümü açık yapmak.

Ama, İstemem VARCHAR değerleri karşılaştırarak, yapmanız gerekenleri yapmak olsaydı; t bugüne kadar dönüştürerek ile rahatsız, sadece 8 karakterden aracılığıyla 5'inci ayıklamak için SUBSTRING işlevi kullanmak istiyorum

SUBSTR(publish_date,5,4) = '-11-' 
0

Sorgunuzda hangi formatta dize hangi olmadığını mysql anlatmaya gerek olarak başına burada demektir Eğer tarih biçimine dizeyi dönüştürmek için çalışıyoruz anlamak zorunda İşte

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%Y-%m-%d')) = 11; 

aşağıda- olmalıdır dönüştürmek istediğiniz format -

Tarih dizesi sonra sorgu

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%d/%m/%Y')) = 11; 

Umut artık sizin de belli olacak bazen daha fazla katta olmalıdır/11/2015 20:11:59' '08 varsayalım eğer

bunu anlamak için.

İlgili konular