【问题标题】:Construct a date from parts in SQL Server 2008从 SQL Server 2008 中的部分构造日期
【发布时间】:2019-02-20 23:17:34
【问题描述】:

我正在使用 SQL Server 2008 并尝试形成一个查询,该查询将使用带有日期计算的 CASEstatement 以根据计算结果返回两个日期之一。

目标是如果计算(在下面的查询中)CURRENT_TIMESTAMP + LEAD_TIME 的结果介于 1 日和 15 日之间,则指定该月的 15 日。否则,返回该月的最后一天。

例如,if CURRENT_TIMESTAMP + LEAD_TIME = 07/12/19, return 07/15/19。 If that calculation = 07/16/19, return 07/31/19。

这似乎可以使用DATEFROMPARTS,但我相信因为我使用的是 SQL Server 2008,所以没有定义该函数(这是我返回的错误)。关于变通的任何想法?

SQL:

 SELECT I.po_number, 
       I.po_item_number AS 'po_item',
       S.orderentry_date, 
       I.po_req_ship_date, 
       I.ex_factory_date, 
       I.del_indicator,
       H.po_type,
       H.vendor_no,
       CASE WHEN DATEPART(dd,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)) BETWEEN 1 AND 15 
            THEN DATEFROMPARTS(DATEPART(yyyy,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME),mm,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME),15)
            ELSE DATEFROMPARTS(DATEPART(yyyy,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME),mm,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)+1,0))
            END  AS 'LT_CALC',
       H.po_created_by,
       I.comment


FROM   rbk_sap_user..vw_po_header H 
JOIN   rbk_sap_user..vw_po_item I ON H.po_number = I.po_number
JOIN   rbk_sap_user..vw_mm_material MM ON I.material = MM.material
JOIN   (SELECT order_no,
               orderentry_date 
        FROM   asagdwpdx_prod..SimoxOrder1 

        UNION ALL

        SELECT order_no,
               orderentry_date 
        FROM   asagdwpdx_prod..SimoxOrder2 

        UNION ALL 

        SELECT order_no,
               orderentry_date 
        FROM   asagdwpdx_prod..SimoxOrder3
         ) S ON S.order_no = H.ahag_number

WHERE   S.orderentry_date BETWEEN '01/31/2019' AND '02/13/2019'
AND     I.del_indicator <> 'L'
AND     H.po_type NOT IN ('02','06','10','UB')
AND     MM.business_segment_code NOT IN ('420','421','422','424')

【问题讨论】:

    标签: sql sql-server case datepart


    【解决方案1】:

    您可以将日期的所有部分转换为VARCHAR,并将它们串在一起为yyyy-mm-dd 格式,然后将CONVERT 转换为DATETIME。

     SELECT 
     ...
        CASE WHEN DATEPART(dd,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)) BETWEEN 1 AND 15 
                THEN CONVERT(DATETIME, CONVERT(varchar, DATEPART(yyyy,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)))+ '-' + CONVERT(VARCHAR, DATEPART (mm,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)))  + '-' + CONVERT(VARCHAR, 15))
                ELSE DATEADD(DAY, -1, CONVERT(DATETIME, CONVERT(VARCHAR, DATEPART(yyyy,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)))+ '-' + CONVERT(VARCHAR, DATEPART(mm,CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)+ 1)  + '-' + CONVERT(VARCHAR, 1)))
                END  AS 'LT_CALC'
    ...
    

    注意ELSE语句中,获取当月最后一天的逻辑是去下个月的第一天,然后用DATEADD函数减去一天。 The SQL Server function EOMONTH 在 SQL Server 2012 中引入,消除了对该逻辑的需求。

    【讨论】:

      【解决方案2】:

      试试这个

      SELECT CAST(LEFT(CONVERT(varchar, CURRENT_TIMESTAMP + LEAD_TIME, 103 ),2) as int)
      

      然后

      CASE WHEN CAST(LEFT(CONVERT(varchar, CURRENT_TIMESTAMP + LEAD_TIME, 103 ),2) as int) < 15 THEN 
        ....
      ELSE
        ....
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多