SQL中的日期计算

这两天写一个和统计数据有关的存储过程,里面要利用日期进行一些计算和判断,也自然要利用SQL的一些日期相关的函数。这里略记一下,当是复习一下SQL。

利用SQL脚本内置的几个函数,我们能灵活的对日期进行计算和比较。常用的几个函数:GETDATE(),DATEDIFF(),DATEADD()

GETDATE() 当然顾名思义,得到当前的日期,返回类型是DateTime类型。

DATEDIFF ( datepart , startdate , enddate ) 用于判断在两个日期之间存在的指定时间间隔的数目。

第一个参数是指定时间间隔的类型,例如mm(月),dd(天),yy(年),ms(毫秒),ss(秒),不同的间隔类型,返回的结果也不一样。

DATEADD (datepart , number, date ) 用于日期运算的函数,将传入的日期,加上指定时间间隔数目的日期。

例如,计算得到本年的第一天:

Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

我们来分析下这个SQL语句就可以知道,首先从最里面的getdate()开始,getdate()得到当前日期和时间,外层的datediff,计算当前日期和1900-01-01 00:00:00之间的时间间隔,返回单位是以年来统计的,如果我们分开看DATEDIFF(yy,0,getdate()),0)的结果,返回就是:109。返回的109,传递给最外层的DATEADD函数,将1900-01-01 00:00:00加上109年,得到的结果,自然就是2009-01-01 00:00:00了,也即本年的第一天。

同样,灵活的利用这几个函数的组合,我们可以得到不同的结果:

得到当月的第一天:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

得到当前季度的第一天:Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

得到当天的起始时间: Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

得到上个月最后一天: Select DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

得到上个月的第一天: Select DATEADD(m,-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

其原理就是得到当月第一天,再减去三毫秒(SQL的时间以3毫秒为一个单位),这样以当前为2月,得到的结果就是:2009-01-31 23:59:59.997

得到去年的最后一天: Select DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

得到本月的最后一天: Select DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

得到本年的最后一天: Select DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

得到本月的第一个星期一: Select DATEADD(wk, DATEDIFF(wk,0,DATEADD(dd,6-datepart(day,getdate()),getdate())), 0)

发布一个ASP.NET相册控件

PhotoAlbum 功能列表: 1.无须数据库支持,直接处理服务器图片目录 2.为大图片生成缩略图,并存放到专门的目录,提高相册预览图片的效率 3.简化图片添加过程,直接上传图片到图片目录即可,相册自动获取、遍历新上传的图片,并生成缩略图 4.增加多页跳转功能 5.简单易用,直接插入控件到你的页面,并进行相关设置即可使用

PhotoAlbum 控件说明: 1.该控件在页面加载的时候,会搜索当前网站指定目录所有jpg格式的文件,在使用时需要指定原图片存放地址和生成的缩略图存放地址,需要添加到web.config文件中:

try { smallfoldername = Server.MapPath(ConfigurationManager.AppSettings[“SmallPath”]); bigfoldername = Server.MapPath(ConfigurationManager.AppSettings[“NormalPath”]); } catch { smallfoldername = Server.MapPath(“./Photo/SmallPics/“); bigfoldername = Server.MapPath(“./Photo/NormalPics/“); }

如果获取用户配置路径失败,控件默认采用./Photo/SmallPics/ 和./Photo/NormalPics/ 两个目录 NormalPics为用户上传原图片的地址,SmallPics为控件生成并存放缩略图的地址。

2.控件在页面加载的时候,遍历原图地址,并逐个生成缩略图,存放到缩略图地址目录。第一次运行,会牺牲效率,当缩略图生成完毕后,运行速度大幅提高。

3.生成缩略图,采用ImageThumbnail类的MakeThumbnail方法实现,缩略图的大小和生成方式,可以自行设置。可以分别按高、宽生成,不过图片可能会产生变形,也可以用CUT裁剪方式。

4.相册处理图片文件,并把图片文件展现给前端浏览器。相册可视化部分,采用DataList控件实现。

字节对齐

为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性, 即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上, 即起始地址能够被4整除。变量的对齐规则如下(32位系统):

Type Alignment

char 在字节边界上对齐

short (16-bit) 在双字节边界上对齐

int and long (32-bit) 在4字节边界上对齐

float 在4字节边界上对齐

double 在8字节边界上对齐

structures 单独考虑结构体的个成员,它们在不同的字节边界上对齐。 其中最大的字节边界数就是该结构的字节边界数。 MSDN原话:Largest alignment requirement of any member 理解结构体的对齐方式有点挠头,如果结构体中有结构体成员, 那么这是一个递归的过程。 对齐方式影响结构体成员在结构体中的偏移设编译器设定的最大对齐字节边界数为n, 对于结构体中的某一成员item,它相对于结构首地址的实际字节对齐数目X应该满足 以下规则:

X = min(n, sizeof(item))

例如,对于结构体 struct {char a; int b} T;

当位于32位系统,n=8时: a的偏移为0, b的偏移为4,中间填充了3个字节, b的X为4;

当位于32位系统,n=2时: a的偏移为0, b的偏移为2,中间填充了1个字节,b的X为2;

结构体的sizeof 设结构体的最后一个成员为LastItem,其相对于结构体首地址的 偏移为offset(LastItem),其大小为sizeof(LastItem),结构体的字节对齐数为N, 则:结构体的sizeof 为: 若offset(LastItem)+ sizeof(LastItem)能够被N整除, 那么就是offset(LastItem)+ sizeof(LastItem),否则,在后面填充, 直到能够被N整除。

例如:32位系统,n=8, 结构体 struct {char a; char b;} T; struct {char a; int b;} T1; struct {char a; int b; char c;} T2; sizeof(T) == 2; N = 1 没有填充 sizeof(T) == 8; N = 4 中间填充了3字节 sizeof(T2)==12; N = 4 中间,结尾各填充了3字节

注意:

1) 对于空结构体,sizeof == 1;因为必须保证结构体的每一个实例在内存中都 有独一无二的地址。

2) 结构体的静态成员不对结构体的大小产生影响,因为静态变量的存储位置与 结构体的实例地址无关。

例如:

struct {static int I;} T; struct {char a; static int I;} T1; sizeof(T) == 1; sizeof(T1) == 1;

  1. 某些编译器支持扩展指令设置变量或结构的对齐方式,如VC, 详见MSDN(alignment of structures)

并不是要求#pragma pack(8),就一定是每个成员都是8字节对齐 而是指一组成员要按照8字节对齐。 struct s1 { short a; // 2字节 long b; // 4字节 }; 整个s1小于8字节,因此s1就是8字节。

struct s2 { char c; // 1字节 s1 d; // 8字节 __int64 e; // 8字节 }; 整个s2小于12字节,但是由于#pragma pack(8)的限定,12不能与8字节对齐,因此s2就是24字节,c占用8字节

发布一个ASP.NET相册控件(含源码)

PhotoAlbum 功能列表: 1.无须数据库支持,直接处理服务器图片目录 2.为大图片生成缩略图,并存放到专门的目录,提高相册预览图片的效率 3.简化图片添加过程,直接上传图片到图片目录即可,相册自动获取、遍历新上传的图片,并生成缩略图 4.增加多页跳转功能 5.简单易用,直接插入控件到你的页面,并进行相关设置即可使用

PhotoAlbum 控件说明: 1.该控件在页面加载的时候,会搜索当前网站指定目录所有jpg格式的文件,在使用时需要指定原图片存放地址和生成的缩略图存放地址,需要添加到web.config文件中:

try { smallfoldername = Server.MapPath(ConfigurationManager.AppSettings[“SmallPath”]); bigfoldername = Server.MapPath(ConfigurationManager.AppSettings[“NormalPath”]); } catch { smallfoldername = Server.MapPath(“./Photo/SmallPics/“); bigfoldername = Server.MapPath(“./Photo/NormalPics/“); }

如果获取用户配置路径失败,控件默认采用./Photo/SmallPics/ 和./Photo/NormalPics/ 两个目录 NormalPics为用户上传原图片的地址,SmallPics为控件生成并存放缩略图的地址。

2.控件在页面加载的时候,遍历原图地址,并逐个生成缩略图,存放到缩略图地址目录。第一次运行,会牺牲效率,当缩略图生成完毕后,运行速度大幅提高。

3.生成缩略图,采用ImageThumbnail类的MakeThumbnail方法实现,缩略图的大小和生成方式,可以自行设置。可以分别按高、宽生成,不过图片可能会产生变形,也可以用CUT裁剪方式。

4.相册处理图片文件,并把图片文件展现给前端浏览器。相册可视化部分,采用DataList控件实现。

读取串口数据

下面是一段把资源导出为文件的代码.先把要打包的文件添加到VC项目中,类型自定(比如”RES_DATA”),ID自定(比如ID_RES_DATA),那么如果要把这个资源再回复为文件就这么调用: Res2File( MAKEINTRESOURCE(ID_RES_DATA), “RES_DATA”, “C:\ResData.dat” )

BOOL Res2File( LPCTSTR lpName, LPCTSTR lpType, LPCTSTR filename ) { HRSRC hRes = ::FindResource( NULL, lpName, lpType ); HGLOBAL gl =::LoadResource( NULL, hRes ); LPVOID lp = ::LockResource( gl ); HANDLE fp = ::CreateFile( filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL ); if( fp == INVALID_HANDLE_VALUE ) return FALSE;

DWORD a; if( !::WriteFile( fp, lp, SizeofResource( NULL, hRes ), &a;, NULL ) ) return FALSE;

CloseHandle( fp ); FreeResource( gl ); return TRUE; } 你可以在运行的时候恢复字体文件,并安装它(只要拷贝到系统目录下的Font文件夹)。

获取系统有几个逻辑分区

char cr[3]; char lable[12]; for(int n=0;n<=25;n++) { CString str; str.Format(“%c:”,n+’A’); strcpy(cr,str); int dt = GetDriveType(cr); int succeed = GetVolumeInformation(cr,lable,12,NULL,NULL,NULL,NULL,0); switch(dt) { case DRIVE_UNKNOWN: { str.Format(“(%s) %s is DRIVE_UNKNOWN!”,lable,cr); break; } case DRIVE_REMOVABLE: { if(succeed) { str.Format(“(%s) %s is DRIVE_REMOVABLE!”,lable,cr); } else { str.Format(“%s is DRIVE_REMOVABLE!”,cr); } break; } case DRIVE_FIXED: { str.Format(“(%s) %s is DRIVE_FIXED!”,lable,cr); break; } case DRIVE_REMOTE: { str.Format(“(%s) %s is DRIVE_REMOTE!”,lable,cr); break; } case DRIVE_CDROM: { str.Format(“(%s) %s is DRIVE_CDROM!”,lable,cr); break; } case DRIVE_RAMDISK: { str.Format(“(%s) %s is DRIVE_RAMDISK!”,lable,cr); break; } default: { str.Empty(); break; } } if(!str.IsEmpty()) { AfxMessageBox(str); } }

用.DEF文件导出DLL中的函数

通常我们在调用DLL时所需的DLL文件必须位于以下三个目录之一:   (1)Windows的系统目录:\windows\system;   (2)DOS中path所指出的任何目录;   (3)程序所在的目录。   一、动态链接库的结构

  动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function), 导出函数可以被其它模块调用,内部函数只能在库内部使用。我们在用C++定制动态库文件时, 需要编写的就是包含导出函数表的模块定义文件(.DEF)和实现导出函数功能的C++文件。下面以 Sample.dll为例介绍DEF文件和实现文件的结构。   1.模块定义文件(.DEF)是一个或多个用于描述DLL属性的模块语句组成的文本文件,每个DEF文 件至少必须包含以下模块定义语句:   ·第一个语句必须是LIBRARY语句,指出DLL的名字;   ·EXPORTS语句列出被导出函数的名字;   ·可以使用DESCRIPTION语句描述DLL的用途(此句可选);   ·”;”对一行进行注释(可选)。   2.实现文件   实现入口表函数的cpp文件中,包含DLL入口点处理的API函数和导出函数的代码。   二、创建Sample.dll    1.首先创建Sample.dll的工程,启动VC++5.0按以下步骤生成DLL工程:   ·在选单中选择File\New\Project;   ·在工程列表中选择Win32 Dynamic-Link Library;   ·在Project Name中输入工程名:Sample;   ·单击Location右边按钮,选择c:\sample目录;   ·单击OK完成,至此已创建了Sample.dll的工程文件。   2.创建Sample.def文件:   ·在选单中选择File\New\Text File;   ·输入以下代码后保存文件名”Sample.def”:    ;Sample.def    ;指出DLL的名字Sample,链接器将这个名字放到DLL导入库中    LIBRARY Sample    ;定义导出函数ShowMe()为例

   EXPORTS    ShowMe    ;def文件结束   3.创建Sample.cpp    .在选单中选择File\New\C++ Source File项    .输入以下代码后保存文件名”Sample.cpp”    //Sample.cpp    #include 〈windows.h〉    int ShowMe(void);    //DllEntryPoint为DLL入口点函数,负责初试化并终止DLL    BOOL WINAPI DllEntryPoint(HINSTANCE hDLL,DWORD dwReason,LPVOID Reserved)    { switch(dwReason)    { case DLL-PROCESS-ATTACH:    { break; }    case DLL-PROCESS-DETACH:    { break; } }    return TRUE; }    int ShowMe(void)    { //蜂鸣器响一下    MessageBeep((WORD)-1);    MessageBox(“你好!”);    return 1; }   4.编译DLL文件   从Build选单中选择Build Sample.DLL,产生Sample.DLL文件,以后就可以随时调用了。   三、在应用程序中调用DLL文件   在应用程序中要首先装入DLL后才能调用导出表中的函数,例如用MFC创建基于对话框的工 程Test,并在对话框上放置”Load”按钮,你就必须添加装载代码。   1.首先在TestDlg.cpp的首部添加变量设置代码:   //设置全局变量gLibSample用于存储DLL句柄   HINSTANCE gLibSample=NULL;   //第二个变量ShowMe是指向DLL库中ShowMe()函数的指针   typedef int( SHOWME)(void);

  SHOWME ShowMe;   2.利用ClassWizard为”Load”按钮添加装载DLL的代码:   Void CTestDlg::OnLoadButton()   { //要添加的代码如下    if(gLibMyDLL!=NULL)    { MessageBox(“The Sample.DLL has already been load.”);    return; }    //装载Sample.dll,未加路径,将在三个默认路径中寻找    gLibSample=LoadLibrary(“SAMPLE.DLL”);    //返回DLL中ShowMe()函数的地址    ShowMe=(SHOWME)GetProcAddress(gLibSample,”ShowMe”); }   3.只要DLL装载成功,在应用程序中就可以直接调用ShowMe()函数(本程序在Windows 95,VC++5.0中运行通过)。

实时时间显示

用计时器实现: SetTimer(1, 1000, NULL); 然后在响应函数: void CAlertDlg::OnTimer(UINT nIDEvent) { static CString strTemp; COleDateTime dtTime;

// 刷新显示的时间 dtTime = COleDateTime::GetCurrentTime(); strTemp.Format(“现在时间 %02i:%02i:%02i “, dtTime.GetHour(), dtTime.GetMinute(), dtTime.GetSecond()); GetDlgItem(IDC_CURTIME)->SetWindowText(strTemp); //IDC_CURTIME即为窗口显示时间的一个 //CEDIT类控件

}

删除非空目录下所有文件

【问题】怎样删除一个非空目录,及其目录里面所有内容: 【解答1】如果不进行递归删除。你可以使用API函数SHFileOperation,它可以一次删除目录及其下面的子目录和文件。 示例代码: BOOL DelTree(LPCTSTR lpszPath) { SHFILEOPSTRUCT FileOp; FileOp.fFlags = FOF_NOCONFIRMATION; FileOp.hNameMappings = NULL; FileOp.hwnd = NULL; FileOp.lpszProgressTitle = NULL; FileOp.pFrom = lpszPath; FileOp.pTo = NULL; FileOp.wFunc = FO_DELETE; return SHFileOperation(&FileOp;) == 0; }

【解答2】使用递归调用,逐个删除: 示例代码:

BOOL DeleteDirectory(char DirName)//如删除 DeleteDirectory(“c:\aaa”) { CFileFind tempFind; char tempFileFind[MAX_PATH]; sprintf(tempFileFind,”%s.*”,DirName); BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind); while(IsFinded) { IsFinded=(BOOL)tempFind.FindNextFile(); if(!tempFind.IsDots()) { char foundFileName[MAX_PATH]; strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH)); if(tempFind.IsDirectory()) { char tempDir[MAX_PATH]; sprintf(tempDir,”%s%s”,DirName,foundFileName); DeleteDirectory(tempDir); } else { char tempFileName[MAX_PATH]; sprintf(tempFileName,”%s%s”,DirName,foundFileName); DeleteFile(tempFileName); } } } tempFind.Close(); if(!RemoveDirectory(DirName)) { MessageBox(0,”删除目录失败!”,”警告信息”,MB_OK);//比如没有找到文件夹,删除失败,可把此句删除 return FALSE; } return TRUE; }

一份进程注入的代码

// Injection.cpp : 定义控制台应用程序的入口点。 //

#include “stdafx.h”

#include “Injection.h”

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

typedef struct _RemotePara{//参数结构 char pMessageBox[12]; DWORD dwMessageBox; }RemotePara; //远程线程 DWORD stdcall ThreadProc (RemotePara *lpPara){ typedef int (stdcall *MMessageBoxA)(HWND,LPCTSTR,LPCTSTR,DWORD);//定义MessageBox函数 MMessageBoxA myMessageBoxA; myMessageBoxA =(MMessageBoxA) lpPara->dwMessageBox ;//得到函数入口地址 myMessageBoxA(NULL,lpPara->pMessageBox ,lpPara->pMessageBox,0);//call return 0; } void EnableDebugPriv();//提升应用级调试权限

int _tmain(int argc, TCHAR argv[], TCHAR envp[]) { const DWORD THREADSIZE=10244; DWORD byte_write; EnableDebugPriv();//提升权限 HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,760); if(!hWnd)return 0; void pRemoteThread =::VirtualAllocEx(hWnd,0,THREADSIZE,MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(!pRemoteThread)return 0; if(!::WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc;,THREADSIZE,0)) return 0;

//再付值 RemotePara myRemotePara; ::ZeroMemory(&myRemotePara;,sizeof(RemotePara)); HINSTANCE hUser32 = ::LoadLibrary (“user32.dll”); myRemotePara.dwMessageBox =(DWORD) ::GetProcAddress (hUser32 , “MessageBoxA”); strcat(myRemotePara.pMessageBox,”hello\0”); //写进目标进程 RemotePara pRemotePara =(RemotePara ) ::VirtualAllocEx (hWnd ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);//注意申请空间时的页面属性 if(!pRemotePara)return 0; if(!::WriteProcessMemory (hWnd ,pRemotePara,&myRemotePara;,sizeof myRemotePara,0))return 0;

//启动线程 HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall )(void ))pRemoteThread ,pRemotePara,0,&byte;_write); if(!hThread){ return 0; } return 0; }

void EnableDebugPriv( void ) { HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp;

if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken; ) ) return; if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue; ) ){ CloseHandle( hToken ); return; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp;, sizeof tkp, NULL, NULL ) ) CloseHandle( hToken ); }