簡體   English   中英

獲取SQL的最后日期

[英]Get Last date of month SQL

我需要以美國(mm-dd-yyyy)格式查找一個月的最后一天,其中包含yymm(nvarchar格式)。

例如:-表示1601 ---> 2016年1月31日

謝謝你的幫助!

使用convert獲取月份的第一天的日期,然后使用dateadd獲取下個月的日期,再使用dateadd獲取前一天的日期:

DECLARE @D char(4) = '1601'

SELECT DATEADD(DAY, -1, DATEADD(MONTH, 1, CONVERT(date, @D + '01', 12)))

結果:

2016-01-31

既然您說20XX年...

declare @oddDate nvarchar(4) = '1601'



select
    DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, '20' + cast(YY as varchar(2)) + cast(MM as varchar(2)) + '01') + 1, 0)) as LastDayof20Year
    ,'20' + cast(YY as varchar(2)) + cast(MM as varchar(2)) + '01' as MadeUpDate
from
(select 
    left(@oddDate,2) as YY
    ,right(@oddDate,2) as MM) x

或者只是...

select
    DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, '20' + cast(left(@oddDate,2) as varchar(2)) + cast(right(@oddDate,2) as varchar(2)) + '01') + 1, 0)) as LastDayof20Year

使用字符串1601 ,我們只需要附加一個01因為將假定本世紀。 可以將這個新的字符串160101轉換為日期。

select convert(varchar(10),dateadd(day,-1,dateadd(month,1,YourCol+'01')),101)
 From  YourTable

退貨

01/31/2016

像下面這樣的東西應該可以解決問題...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData;

CREATE TABLE #TestData (
    CharDate CHAR(4) NOT NULL 
    );

INSERT #TestData (CharDate) VALUES 
    ('9801'), ('9902'), ('0012'), ('0202'), ('1005'), ('1503');

--============================================================

SELECT
    FormattedEOM = CONVERT(CHAR(10), em.EndOfMonth, 101)
FROM
    #TestData td
    CROSS APPLY ( VALUES (CASE WHEN CAST(LEFT(td.CharDate, 2) AS INT) > 30 THEN '19' ELSE '20' END) ) c (Century)
    CROSS APPLY ( VALUES (DATEFROMPARTS(CONCAT(c.Century, LEFT(td.CharDate, 2)), RIGHT(td.CharDate, 2), 1)) ) fm (FirstOfMonth)
    CROSS APPLY ( VALUES (EOMONTH(fm.FirstOfMonth)) ) em (EndOfMonth);

HTH,傑森

編輯:以下應與2008年一起使用。

SELECT
    FormattedEOM = CONVERT(CHAR(10), em.EndOfMonth, 101)
FROM
    #TestData td
    CROSS APPLY ( VALUES (CASE WHEN CAST(LEFT(td.CharDate, 2) AS INT) > 30 THEN '19' ELSE '20' END) ) c (Century)
    CROSS APPLY ( VALUES (CAST(c.Century + td.CharDate + '01' AS DATE)) ) fm (FirstOfMonth)
    CROSS APPLY ( VALUES (DATEADD(mm, 1, fm.FirstOfMonth)) ) nm (NextMonth)
    CROSS APPLY ( VALUES (DATEADD(dd, -1, nm.NextMonth)) ) em (EndOfMonth);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM