Tarih sütunlarını karşılaştırın

Service_date öğesinin prod_date değerinden büyük olduğu satırları almam gerekiyor. Prod_date için veri türü VARCHAR (10) (örneğin 2/20/2014) ve service_date için veri türü DATE (YYYYMMDD) şeklindedir. "Service_date = '20140201' olan servisten service_date'i seçin" kullanarak service_date'i sorgularsam sonuç, sonuç tablosunda "2/1/2014" olarak gösterilir. Ancak, prod_date ile karşılaştırmak için service_date öğesini varchar öğesine dönüştürdüğümde aşağıdaki sorguda çalışmaz. Service_date değerine sahip olanlar yerine tüm satırları çeker.

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND CAST(S.SERVICE_DATE AS VARCHAR(10)) >= P.PROD_DATE
0
Evet tek haneli.
katma yazar angelcake, kaynak
PROD_DATE için Ocak ve Eylül ayları arasındaki tüm aylar tek haneli ay mı?
katma yazar Rob Paller, kaynak

6 cevap

Basitlik için mümkünse dize/varchar siparişi yerine tarih sıralamasını kullanmanızı öneririm.

Örneğin

'01/02/2014' >= '04/01/2013'  -- if these are dates or cast to dates

fakat

'01/02/2014' <  '04/01/2013'  -- if these are strings

Bu yüzden işleri basit tutmak için, aşağıdaki iki alanı karşılaştırırken bir tarihe PROD_DATE dökmek mantıklı olacaktır:

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND S.SERVICE_DATE >= cast(P.PROD_DATE as date format 'DD/MM/YYYY')
;

Geçerli tarihler olarak prod_dates kalitesiyle ilgili herhangi bir şüphe varsa, önce tüm tarihlerdeki dönüşümü kontrol edebilir (yukarıda çalıştırmadan/ayarlamadan önce)

1
katma
Excel'deki tarih formatını iki basamaklı tarih formatıyla değiştirdim, böylece ya prod_date tarih formatına çalışır ya da service_date tarihe ve ardından varchar (10) format çalışır. Bilgiyi paylaştığınız için teşekkür ederiz, bu yüzden geçici ürün tablosu için tarih formatını excel olarak değiştirmek için çalışmam gerektiğini fark ettim.
katma yazar angelcake, kaynak
Doğru. Sadece bir test yaptım ve teradata sadece iki basamaklı formatı kabul ediyor.
katma yazar angelcake, kaynak
PROD_DATE tarih biçimine gönderdiğimde bana "geçersiz tarih" hatası veriyor.
katma yazar angelcake, kaynak
Teradata iki basamaklı bir ay beklediğinden biçim geçersiz. FORMAT yan tümcesini tek basamaklı bir ay kabul etmeye zorlamanın bir yolunu göremiyorum.
katma yazar Rob Paller, kaynak

Basitlik için mümkünse dize/varchar siparişi yerine tarih sıralamasını kullanmanızı öneririm.

Örneğin

'01/02/2014' >= '04/01/2013'  -- if these are dates or cast to dates

fakat

'01/02/2014' <  '04/01/2013'  -- if these are strings

Bu yüzden işleri basit tutmak için, aşağıdaki iki alanı karşılaştırırken bir tarihe PROD_DATE dökmek mantıklı olacaktır:

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND S.SERVICE_DATE >= cast(P.PROD_DATE as date format 'DD/MM/YYYY')
;

Geçerli tarihler olarak prod_dates kalitesiyle ilgili herhangi bir şüphe varsa, önce tüm tarihlerdeki dönüşümü kontrol edebilir (yukarıda çalıştırmadan/ayarlamadan önce)

1
katma
Excel'deki tarih formatını iki basamaklı tarih formatıyla değiştirdim, böylece ya prod_date tarih formatına çalışır ya da service_date tarihe ve ardından varchar (10) format çalışır. Bilgiyi paylaştığınız için teşekkür ederiz, bu yüzden geçici ürün tablosu için tarih formatını excel olarak değiştirmek için çalışmam gerektiğini fark ettim.
katma yazar angelcake, kaynak
Doğru. Sadece bir test yaptım ve teradata sadece iki basamaklı formatı kabul ediyor.
katma yazar angelcake, kaynak
PROD_DATE tarih biçimine gönderdiğimde bana "geçersiz tarih" hatası veriyor.
katma yazar angelcake, kaynak
Teradata iki basamaklı bir ay beklediğinden biçim geçersiz. FORMAT yan tümcesini tek basamaklı bir ay kabul etmeye zorlamanın bir yolunu göremiyorum.
katma yazar Rob Paller, kaynak

Basitlik için mümkünse dize/varchar siparişi yerine tarih sıralamasını kullanmanızı öneririm.

Örneğin

'01/02/2014' >= '04/01/2013'  -- if these are dates or cast to dates

fakat

'01/02/2014' <  '04/01/2013'  -- if these are strings

Bu yüzden işleri basit tutmak için, aşağıdaki iki alanı karşılaştırırken bir tarihe PROD_DATE dökmek mantıklı olacaktır:

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND S.SERVICE_DATE >= cast(P.PROD_DATE as date format 'DD/MM/YYYY')
;

Geçerli tarihler olarak prod_dates kalitesiyle ilgili herhangi bir şüphe varsa, önce tüm tarihlerdeki dönüşümü kontrol edebilir (yukarıda çalıştırmadan/ayarlamadan önce)

1
katma
Excel'deki tarih formatını iki basamaklı tarih formatıyla değiştirdim, böylece ya prod_date tarih formatına çalışır ya da service_date tarihe ve ardından varchar (10) format çalışır. Bilgiyi paylaştığınız için teşekkür ederiz, bu yüzden geçici ürün tablosu için tarih formatını excel olarak değiştirmek için çalışmam gerektiğini fark ettim.
katma yazar angelcake, kaynak
Doğru. Sadece bir test yaptım ve teradata sadece iki basamaklı formatı kabul ediyor.
katma yazar angelcake, kaynak
PROD_DATE tarih biçimine gönderdiğimde bana "geçersiz tarih" hatası veriyor.
katma yazar angelcake, kaynak
Teradata iki basamaklı bir ay beklediğinden biçim geçersiz. FORMAT yan tümcesini tek basamaklı bir ay kabul etmeye zorlamanın bir yolunu göremiyorum.
katma yazar Rob Paller, kaynak

Basitlik için mümkünse dize/varchar siparişi yerine tarih sıralamasını kullanmanızı öneririm.

Örneğin

'01/02/2014' >= '04/01/2013'  -- if these are dates or cast to dates

fakat

'01/02/2014' <  '04/01/2013'  -- if these are strings

Bu yüzden işleri basit tutmak için, aşağıdaki iki alanı karşılaştırırken bir tarihe PROD_DATE dökmek mantıklı olacaktır:

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND S.SERVICE_DATE >= cast(P.PROD_DATE as date format 'DD/MM/YYYY')
;

Geçerli tarihler olarak prod_dates kalitesiyle ilgili herhangi bir şüphe varsa, önce tüm tarihlerdeki dönüşümü kontrol edebilir (yukarıda çalıştırmadan/ayarlamadan önce)

1
katma
Excel'deki tarih formatını iki basamaklı tarih formatıyla değiştirdim, böylece ya prod_date tarih formatına çalışır ya da service_date tarihe ve ardından varchar (10) format çalışır. Bilgiyi paylaştığınız için teşekkür ederiz, bu yüzden geçici ürün tablosu için tarih formatını excel olarak değiştirmek için çalışmam gerektiğini fark ettim.
katma yazar angelcake, kaynak
Doğru. Sadece bir test yaptım ve teradata sadece iki basamaklı formatı kabul ediyor.
katma yazar angelcake, kaynak
PROD_DATE tarih biçimine gönderdiğimde bana "geçersiz tarih" hatası veriyor.
katma yazar angelcake, kaynak
Teradata iki basamaklı bir ay beklediğinden biçim geçersiz. FORMAT yan tümcesini tek basamaklı bir ay kabul etmeye zorlamanın bir yolunu göremiyorum.
katma yazar Rob Paller, kaynak

Bu, tarihinizin karakter olması ve% 100 beklenmeyen değerlere sahip olması durumunda% 100 hata kanıtı değildir. Önde gelen 0'ı ay değerine nasıl ekleyebileceğinizi ve ayın ikinci konumda / konumuna göre tek bir basamak olarak belirlendiği bir tarihe atayabileceğinizi gösterir. Belirli bir satır için PROD_DATE değeri.

SELECT CASE WHEN POSITION('/' IN TRIM(P.PROD_DATE)) = 2
            THEN CAST('0'|| TRIM(P.PROD_DATE) AS CHAR(10)) AS DATE FORMAT 'MM/DD/YYYY')
            ELSE CAST(P.PROD_DATE AS DATE FORMAT 'MM/DD/YYYY')
       END AS PROD_DATE_
  FROM PRODUCT P;
0
katma

Bu, tarihinizin karakter olması ve% 100 beklenmeyen değerlere sahip olması durumunda% 100 hata kanıtı değildir. Önde gelen 0'ı ay değerine nasıl ekleyebileceğinizi ve ayın ikinci konumda / konumuna göre tek bir basamak olarak belirlendiği bir tarihe atayabileceğinizi gösterir. Belirli bir satır için PROD_DATE değeri.

SELECT CASE WHEN POSITION('/' IN TRIM(P.PROD_DATE)) = 2
            THEN CAST('0'|| TRIM(P.PROD_DATE) AS CHAR(10)) AS DATE FORMAT 'MM/DD/YYYY')
            ELSE CAST(P.PROD_DATE AS DATE FORMAT 'MM/DD/YYYY')
       END AS PROD_DATE_
  FROM PRODUCT P;
0
katma