Thursday, April 18, 2024

Tìm ngày đầu tiền và ngày cuối cùng của tháng với SQL Server

 -- Cách 1:

-- xác định ngày đầu tiên của tháng hiện tại

SELECT DATEADD(dd,-DAY(getdate()-1),GETDATE())

--- xác định ngày cuối cùng của tháng hiện tại có thể sử dụng cách như sau: xác định tháng tiếp theo, sau đó lấy ngày đầu tiên của tháng đó - 1 = ngày cuối cùng của tháng này

SELECT DATEADD(MONTH,1,GETDATE()) -- ngày này của tháng tiếp theo


--- Ngày đầu tiên của tháng tiếp theo

SELECT DATEADD(dd,-DAY(DATEADD(MONTH,1,GETDATE())-1),DATEADD(MONTH,1,GETDATE()))



--- Ngày cuối cùng của tháng hiện tại bằng ngày cuối -1, vì đã trừ 1 ở trên nên chúng ta bỏ từ 1 thì sẽ là ngày cuối cùng của tháng

SELECT DATEADD(dd,-DAY(DATEADD(MONTH,1,GETDATE())),DATEADD(MONTH,1,GETDATE()))

---Ngoài ra còn có câu lệnh gọn hơn như dưới

SELECT EOMONTH(GETDATE())



Cách 2:

Ngoài ra có một số cách trên internet sử dụng hàm DATEADD ( cộng trừ ngày) và DATEDIFF( tính khoản thời gian) để tính  ngày đầy và ngày cuối cùng của tháng

DECLARE @mydate DATETIME


SELECT @mydate = GETDATE()

SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)),@mydate),101) ,

N'Ngày cuối tháng trước'

UNION

SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)-1),@mydate),101) AS Date_Value,

N'Ngày đầu tháng hiện tại' AS Date_Type

UNION

SELECT CONVERT(VARCHAR(25),@mydate,101) AS Date_Value, N'hôm nay' AS Date_Type

UNION

SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)),101) ,

N'Ngày cuối tháng này'

UNION

SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))-1),DATEADD(mm,1,@mydate)),101) ,

N'Ngày đầu tháng tiếp theo'


 Hiểu cách này thì dùng cách đó thôi

Tuesday, April 16, 2024

Tạo bảng Dimentions Date on SQL

 Việc tạo bảng Dim_date phân tích dữ liệu và xây dựng báo cáo  trong các BI cực kỳ quan trọng. 

dưới đây là 2 câu lệnh mình sưu tầm được tạo nhanh bảng Date dưới SQL phục vụ cho công việc.


Tạo bảng Dim date trong sql


full code generate :

/* ACB */

CREATE TABLE dbo.Dim_Date (

   [DateKey] INT NOT NULL PRIMARY KEY,

   [Date] DATE NOT NULL,

   [Day] TINYINT NOT NULL,

   [DaySuffix] CHAR(2) NOT NULL,

   [Weekday] TINYINT NOT NULL,

   [WeekDayName] VARCHAR(10) NOT NULL,

   [WeekDayName_Short] CHAR(3) NOT NULL,

   [WeekDayName_FirstLetter] CHAR(1) NOT NULL,

   [DOWInMonth] TINYINT NOT NULL,

   [DayOfYear] SMALLINT NOT NULL,

   [WeekOfMonth] TINYINT NOT NULL,

   [WeekOfYear] TINYINT NOT NULL,

   [Month] TINYINT NOT NULL,

   [MonthName] VARCHAR(10) NOT NULL,

   [MonthName_Short] CHAR(3) NOT NULL,

   [MonthName_FirstLetter] CHAR(1) NOT NULL,

   [Quarter] TINYINT NOT NULL,

   [QuarterName] VARCHAR(6) NOT NULL,

   [Year] INT NOT NULL,

   [MMYYYY] CHAR(6) NOT NULL,

   [MonthYear] CHAR(7) NOT NULL,

   [IsWeekend] BIT NOT NULL,

   [IsHoliday] BIT NOT NULL,

   

   )


-- Tự động  Generate dữ liệu dữ liệu dimension_date


   SET NOCOUNT ON


TRUNCATE TABLE DIM_Date


DECLARE @CurrentDate DATE = '2020-01-01'

DECLARE @EndDate DATE = '2025-12-31'


WHILE @CurrentDate < @EndDate

BEGIN

   INSERT INTO [dbo].[Dim_Date] (

      [DateKey],

      [Date],

      [Day],

      [DaySuffix],

      [Weekday],

      [WeekDayName],

      [WeekDayName_Short],

      [WeekDayName_FirstLetter],

      [DOWInMonth],

      [DayOfYear],

      [WeekOfMonth],

      [WeekOfYear],

      [Month],

      [MonthName],

      [MonthName_Short],

      [MonthName_FirstLetter],

      [Quarter],

      [QuarterName],

      [Year],

      [MMYYYY],

      [MonthYear],

      [IsWeekend],

      [IsHoliday]

      )

   SELECT DateKey = YEAR(@CurrentDate) * 10000 + MONTH(@CurrentDate) * 100 + DAY(@CurrentDate),

      DATE = @CurrentDate,

      Day = DAY(@CurrentDate),

      [DaySuffix] = CASE 

         WHEN DAY(@CurrentDate) = 1

            OR DAY(@CurrentDate) = 21

            OR DAY(@CurrentDate) = 31

            THEN 'st'

         WHEN DAY(@CurrentDate) = 2

            OR DAY(@CurrentDate) = 22

            THEN 'nd'

         WHEN DAY(@CurrentDate) = 3

            OR DAY(@CurrentDate) = 23

            THEN 'rd'

         ELSE 'th'

         END,

      WEEKDAY = DATEPART(dw, @CurrentDate),

      WeekDayName = DATENAME(dw, @CurrentDate),

      WeekDayName_Short = UPPER(LEFT(DATENAME(dw, @CurrentDate), 3)),

      WeekDayName_FirstLetter = LEFT(DATENAME(dw, @CurrentDate), 1),

      [DOWInMonth] = DAY(@CurrentDate),

      [DayOfYear] = DATENAME(dy, @CurrentDate),

      [WeekOfMonth] = DATEPART(WEEK, @CurrentDate) - DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0)) + 1,

      [WeekOfYear] = DATEPART(wk, @CurrentDate),

      [Month] = MONTH(@CurrentDate),

      [MonthName] = DATENAME(mm, @CurrentDate),

      [MonthName_Short] = UPPER(LEFT(DATENAME(mm, @CurrentDate), 3)),

      [MonthName_FirstLetter] = LEFT(DATENAME(mm, @CurrentDate), 1),

      [Quarter] = DATEPART(q, @CurrentDate),

      [QuarterName] = CASE 

         WHEN DATENAME(qq, @CurrentDate) = 1

            THEN 'First'

         WHEN DATENAME(qq, @CurrentDate) = 2

            THEN 'second'

         WHEN DATENAME(qq, @CurrentDate) = 3

            THEN 'third'

         WHEN DATENAME(qq, @CurrentDate) = 4

            THEN 'fourth'

         END,

      [Year] = YEAR(@CurrentDate),

      [MMYYYY] = RIGHT('0' + CAST(MONTH(@CurrentDate) AS VARCHAR(2)), 2) + CAST(YEAR(@CurrentDate) AS VARCHAR(4)),

      [MonthYear] = CAST(YEAR(@CurrentDate) AS VARCHAR(4)) + UPPER(LEFT(DATENAME(mm, @CurrentDate), 3)),

      [IsWeekend] = CASE 

         WHEN DATENAME(dw, @CurrentDate) = 'Sunday'

            OR DATENAME(dw, @CurrentDate) = 'Saturday'

            THEN 1

         ELSE 0

         END,

      [IsHoliday] = 0


   SET @CurrentDate = DATEADD(DD, 1, @CurrentDate)

END

 Sau khi tạo xong ta có  bảng sau:










Wednesday, January 31, 2024

Lưu cache user login domain

 

Vào regedit theo đường dẫn bên dưới


Location: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\

Value name: CachedLogonsCount

Data type: REG_SZ

Values: 0 - 50 ==> chỉnh giá trị tùy ý