Thursday, August 8, 2024

Tạo report gửi email tự động với MSSQL

 

Tạo một câu lệnh gửi email

Step 1:

Tạo mail database profile như hình bên dưới




Bước 2:

Copy câu lệnh bỏ trực tiếp vào  cửa sổ đang mở bước số 5, nhơ thay đổi địa chỉ email người nhập vào



 

 

DECLARE @tableHTML NVARCHAR(MAX);

DECLARE @dateSync VARCHAR(200) = CONVERT(Varchar,getdate());

SET @tableHTML = 'This is an automatic email that is send from the system.<br>

The following is a table of stores which synchronized data to system.<br>'

+N'<H1>Check Synchronized at '+@dateSync+'</H1>' + N'<table border="1">'

    + N'<tr style="font-family:Arial;font-size:14px;padding:10px 5px;width:100%;background-color:#ff9900;color:#333">

            <th>Id</th>

            <th>StoreName</th>'

    + N'<th>Sync_Check</th>

            <th>Date_Check</th></tr>'

    + CAST(( SELECT DISTINCT td=(BRPOSStoreID),'',

                                                                                    td=(BRPOSStoreName),''

                        ,td=(CASE WHEN FORMAT(BRRecheckSyncFromPOSToDate,'dd/MM/yyyy') IS NULL THEN N'CHƯA ĐỒNG BỘ'

                                    ELSE N'ĐÃ ĐỒNG BỘ' END),''

                        ,td=(FORMAT(getdate(),'dd/MM/yyyy')),''

                        FROM BJStoreName

                        left join BJ_BRRecheckSyncFromPOSs

                        on BJStoreName.BRPOSStoreName=BRRecheckSyncFromPOSStoreName and FORMAT(BRRecheckSyncFromPOSToDate,'dd/MM/yyyy') = FORMAT(getdate()-1, 'dd/MM/yyyy')

                                    where AAStatus='Alive' and BRPOSStoreID in (2,3,5,7,9,11,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30)

                                    Order by (CASE WHEN FORMAT(BRRecheckSyncFromPOSToDate,'dd/MM/yyyy') IS NULL THEN N'CHƯA ĐỒNG BỘ'

                                    ELSE N'ĐÃ ĐỒNG BỘ' END)  

          FOR XML PATH('tr'),

                TYPE

            ) AS NVARCHAR(MAX))

    + N'</table> <br>'

            +N'Please let me know if you have any questions or need further clarification.<br><br>'

            +N'Thanks & regards,<br>'

            +N'IT Department';

 EXEC msdb.dbo.sp_send_dbmail

            @profile_name = 'Email_Automation',

            @recipients =nhập Email người nhận tại đây’,

    @subject = 'Report daily check synchronized from store to PosHead',

    @body = @tableHTML,

    @body_format = 'HTML';

Bước 3:  Tạo lịch để chạy SQL này, vào phần schedule , phần này dễ anh chị em có thể search trên google

Cuối cùng chạy thử 1 lệnh chúng ta thấy kết quả, anh chị có thể thay đổi format cho báo cáo đẹp hơn, phần này có thể áp dụng làm báo cáo trực tiếp bằng SQL cũng được.



 

Chúc mọi người thành công







Sunday, May 19, 2024

Cài đặt docker trên Ubuntu 24.04 (Series docker- Tập 1)

 Kiểm tra Ip đang có của máy unbuntu 24.024 

Ip addr

Mọi thứ ổn đúng ip mong muốn, ping internet thông thì chúng ta tiến hành thực hiện bước tiếp theo

Cài đặt openssh để connect vào docker làm việc thông may ssh trên máy windows

sudo apt-get install openssh-server

Cho phép port thông 22 của ssh thông qua firewall

               sudo ufw allow 22/tcp

Hoặc

   sudo ufw allow ssh

Kiểm tra trạng thái dịch vụ ssh server       
    sudo systemctl status sshd.service



Tham khảo từ link

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04

thiết lập các update cho package đang có

sudo apt update

Cài đặt các packages cần thiết để có thể cài đặt apt thông qua https

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Thêm key GPG cho kho chứa docker trong máy tính của bạn.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

Add the Docker repository to APT sources:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

Kiểm tra có thể cài đặt docker từ  mặc định ubuntu repo

    apt-cache policy docker-ce

cài đặt bảng docker community edition

    sudo apt install docker-ce

    sudo systemctl status docker

Nếu bạn không muốn gõ sudo phía trước các lệnh docker thì bạn  thêm user vào nhóm có quyền chạy Docker

Thay ${USER} = tên user bạn muốn add vào docker

sudo usermod -aG docker ${USER}

su - ${USER}

cuối cùng kiểm tra xem thông tin container đang có

    docker info



Như thế xong phần cài đặt docker trên Ubuntu 24.04.  Mọi người cứ làm theo hướng dẫn thì sẽ thành công. Mình làm biến chụp hình step by step. Chúc anh, em thành công .

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 ý