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 ý

Sunday, December 3, 2023

Các câu lệnh truy vấn cơ bản trong SQL

 Tìm ID trùng nhau trong SQL

  SELECT TOP(1) BRPOSItemID  FROM Fact_OrderDetail

    GROUP BY BRPOSItemID

HAVING COUNT(BRPOSItemID) >1

Giải thích: Với BRPOSItemID  là khóa chính của bảng dữ liệu, duy nhất và không lặp lại


Sử dụng Pivot để đếm các trạng thái BILL

Select  BRPOSStoreName as IDStore,[E-Wallet],[Sample],[Credit],[Cancel],[Cash],[Gift]

From

(select T2.BRPOSStoreName, BRPmtDetailType,BRPOSNo

from BJFactSample as T1

Left join BJStoreName as T2 on T2.BRPOSStoreID = T1.FK_BRPOSStoreID

where YEAR(BRPOSDate) =2023 and Month(BRPOSDate) =10) P

PIVOT (

COUNT (BRPOSNo) FOR BRPmtDetailType IN

([E-Wallet],[Sample],[Credit],[Cancel],[Cash],[Gift])

) AS PVT



-- Muốn đếm số Bill trong 1 khoản tiền, bài này có thể áp dụng đếm số ngày công nợ quá hạn

--Count các số bill có số tiền lớn hơn:

 50 K<Bill < 100K

100 K<Bill < 150K

Sử dụng Pivot trong bài này, ngoài ra cũng có thể sử dụng count kết hợp group by cũng được. đang sẵn viết câu Pivot trên nên ví dụ này biết pivot luôn

Select  CuaHang, T50,T100,T120 from

(select BRPOSStoreName as CuaHang, SumofTotalAPIAus,

(Case

when (SumofTotalAPIAus <100000 and SumofTotalAPIAus >=50000) then 'T50'

when (SumofTotalAPIAus <150000 and SumofTotalAPIAus >=100000) then 'T100'

else 'T120' end )as tien

from Fact_OrderSumary

where YEAR(BRPOSDate)=2023) p

pivot 

(

count(SumofTotalAPIAus) for tien in (T50,T100,T120)

)as PVT



Kiểm tra lịch sử câu lệnh đã truy vấn trong SQL server

SELECT top(10) Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*

FROM sys.query_store_plan AS Pl

INNER JOIN sys.query_store_query AS Qry

    ON Pl.query_id = Qry.query_id

INNER JOIN sys.query_store_query_text AS Txt

    ON Qry.query_text_id = Txt.query_text_id

order by initial_compile_start_time DESC

Friday, May 15, 2020

Thay đổi tên domain trong windows donmain controller server 2016


Nhu cầu: Thay đổi domain name Tencongty.com  -> tencongty.local
Lưu ý: trước khi thây đổi tên domain name  phải remove các add domain
Bước 1: kiểm tra tool AD DS and AD LDS tools đã được cài đặt chưa? Nếu chưa thì tiến hành cài đặt.



B1: Tạo new zone Forward lookup zone tenconty.local






B2: Mở cửa sổ CMD chạy lệnh
 rendom /list
Tiếp theo tại thư mục " C:\Users\administrator.tencongty" mở file có tên Domainlist.xml


thay đổi các thông số sau cho phù hợp
B3: Tiếp theo mở cmd chạy lệnh update lại domain mới
rendom /upload
tiếp theo chạy lệnh kiểm tra hệ thống trước khi tiến hành thực thi thay đổi
rendom /prepare
Nếu không có lỗi các anh, chị chạy tiếp lệnh thực thi
rendom /execute
Sau khi chạy xong thì các OU sẽ di chuyển sang domain mới

B4: Sau khi chạy xong cần thay đổi tên máy tính
Tiến hành đổi tên domain với lệnh sau:

netdom computername AD02.tenconty.com add:AD02.tencongty.local
Tiếp theo chúng ta định nghĩa lại domain chính
netdom computername AD02.tenconty.com /makeprimary: AD02.tencongty.local

B5: Sau khi thay đổi xong cần reboot lại máy tính
Tiếp theo chúng ta cần update lại group policy magement với tên domain mới.

 Mở của sổ cmd lên để chạy lệnh fix
gpfixup /olddns:tencongty.com /newdns:tenconty.local
tiếp theo chạy lệnh
gpfixup /oldnb:tencongty /newnb:tencongty
xong nhấn lệnh như dưới để kết thúc quá trình thay đổi tên và không đóng băng để domain mới có thể hoạt động
rendom /end
Vì làm xong rồi mới log lại nên sẽ thiếu hình chi tiết từng bước. nhưng về các bước và lệnh các bước không thay đổi. 

Network