【问题标题】:SQL Change Null date or 1-1-1900 00:00:00 to Current DateSQL 将 Null 日期或 1-1-1900 00:00:00 更改为当前日期
【发布时间】:2018-04-30 19:31:18
【问题描述】:

到目前为止,我用谷歌搜索了几个小时,并尝试了许多不同的方法,但不知何故,与其他人一起使用的方法似乎不适用于我的数据集。

*编辑:DBMS: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 转换为今天的日期,但每当我尝试使用NULLIFCOALESCE 执行此操作时,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)) = ''        

【问题讨论】:

  • 你尝试了什么?
  • 数据库是什么?
  • 对于此类问题,您应该提供更多详细信息,例如数据库供应商和版本。由于您使用了 NULLIF,我想它是 MSSQL DB,您可以尝试从表中选择 NULLIF(todate, getdate()) 这适用于空值。希望可以进一步指导您。
  • COALESCE 应该可以工作。请出示您的代码。你的 DBMS 是什么? SQL 服务器?甲骨文? PostgreSQL? ...
  • 标准 SQL:COALESCE(TODATE, CURRENT_DATE)

标签: sql date coalesce nullif


【解决方案1】:

COALESCE()NULL 替换为一个值,这就是您想要的。 NULLIF() 将一个值替换为 NULL 并且不适用于此处。

我猜你正在做COALESCE(TODATE,''),它将用1-1-1900 00:00:00的默认日期时间替换NULL

确保你正确地喂它今天的日期COALESCE(TODATE,GETDATE())

获取今天日期的功能会因您的 DBMS 而异。始终使用您的 DBMS(SQL Server、MySQL、Oracle 等)标记您的问题,以获得最佳答案。

【讨论】:

  • 我现在尝试了很多不同的方法,其中之一是 COALESCE(A.VALIDTO,GETDATE()) AS VALID.TO,它仍然返回 1-1-1900 00:00:00。我认为问题在于我使用 PowerBI,并且“空值”已经转换为 1-1-1900 00:00:00 而不是 NULL。因此,也许有一种方法可以将 1-1-1900 00:00:00 的日期更改为 GETDATE() 或将来的随机日期,例如 1-1-2050 00:00:00。
  • @titatovenaar 啊,这也解释了你为什么要尝试NULLIF()。尝试将日期更改为NULL,然后将其合并回今天的日期:COALESCE(NULLIF(A.VALIDTO,'1-1-1900 00:00:00'),GETDATE())
  • 谢谢!这确实是我的问题的解决方案。下次我会尽量少一些混乱。干杯,伊戈尔
【解决方案2】:

你不应该使用NULLIF,它的目的是比较值。如果你想在 select 语句中用一个值代替 null,你可以使用 isnull(对于 SQL server)或ifnull(对于 MySQL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多