SQL Изменить нулевую дату или 1-1-1900 00:00:00 на текущую дату - PullRequest
0 голосов
/ 30 апреля 2018

Я гуглил пару часов и пробовал много разных вещей, но что-то, что работает с другими, похоже, не работает с моим набором данных.

* РЕДАКТИРОВАТЬ: СУБД: SQL Server. + Код ниже

Допустим, это набор данных:

ID,VALIDFROM,VALIDTO

1,1-1-2012,1-1-1900 00:00:00

2,1-1-2016,1-3-2017 00:00:00

3,1-1-2017,1-3,2018 00:00:00

4,1-1-2017,1-1-1900 00:00:00

5,1-1-2018,1-1-1900 00:00:00

Я хочу преобразовать NULL в сегодняшнюю дату, но всякий раз, когда я пытаюсь сделать это с NULLIF или COALESCE, SQL возвращает 1-1-1900 00:00:00.

SELECT
A.CONTRACTLINEID,
A.CONTRACTID AS 'Contract ID',
COALESCE(C.RENTALCOSTTYPEID, 'LEEG') AS 'Component ID',
A.NAME AS 'Component',
A.LINETYPE AS 'Componenttype ID',
B.ENUMITEMLABEL AS 'Componenttype',
A.RENTALOBJECTID AS 'Vastgoed Object ID',
A.VALIDFROM,
--A.VALIDTO, -- 1-1-1900 00:00:00
--COALESCE(A.VALIDTO,Sysdate()) AS VALIDTO, -- ERROR
--COALESCE(A.VALIDTO,GETDATE()) AS VALIDTO, -- 1-1-1900 00:00:00
--COALESCE(A.VALIDTO,CURRENT_DATE) AS VALIDTO, -- ERROR
--NULLIF(A.VALIDTO,GETDATE()) AS VALIDTO, -- 1-1-1900 00:00:00
--NULLIF(A.VALIDTO,CURRENT_DATE) AS VALIDTO, -- ERROR
A.COSTSETTLEMENTID,
A.PRICEPERIODID,
A.DATAAREAID,
C.PRICEPRICEID AS 'Prijs ID',
COALESCE(C.PRICE, '0') AS 'Prijs',
C.FROMDATE AS 'Prijs Vanaf Datum',
C.TODATE AS 'Prijs T/m Datum',
COALESCE(C.NAME, 'LEEG') AS 'Component-Prijs',
D.CONTRACTSTATUS AS 'Contract Status'
FROM MRPMCCONTRACTLINES A
LEFT JOIN MRENUMS B ON
B.ENUMITEMVALUE = A.LINETYPE
AND B.ENUMID = 40021
OUTER APPLY
(
    SELECT  TOP 1 *
    FROM    MRPMCINVOICELINE C
    WHERE   C.CONTRACTLINEID = A.CONTRACTLINEID AND C.DATAAREAID = '1'
    ORDER BY
            C.TODATE DESC
    ) C
LEFT JOIN PMCCONTRACT D ON
D.CONTRACTID = A.CONTRACTID --Following doesn't do anything so far 
UPDATE MRPMCCONTRACTLINES
SET VALIDTO = '01/01/2050' 
WHERE VALIDTO IS NULL 
OR LTRIM(RTRIM(VALIDTO)) = ''        

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

COALESCE() заменяет NULL значением, так что это то, что вы хотите. NULLIF() заменяет значение на NULL и здесь не применяется.

Полагаю, вы делаете COALESCE(TODATE,''), который заменит NULL на дату по умолчанию 1-1-1900 00:00:00.

Убедитесь, что вы правильно указали сегодняшнюю дату COALESCE(TODATE,GETDATE())

Функция получения сегодняшней даты зависит от вашей СУБД. Всегда помечайте свой вопрос своей СУБД (SQL Server, MySQL, Oracle и т. Д.), Чтобы получить наилучшие ответы.

0 голосов
/ 30 апреля 2018

вы не должны использовать NULLIF, его цель - сравнить значения. Если вы хотите заменить значение на ноль в операторе выбора, вы должны использовать isnull (для сервера SQL) или ifnull (для MySQL)

...